关于宽字节和多字节的有关问题

关于宽字节和多字节的问题
我在一个项目中使用的 unicode字符集,并创建了一个自定义按钮,在但使用时, 发现其中一个类要使用自定义按钮时要多字节(比如char)才能显示按钮名称,否则出现乱码,另一个类则要使用宽字节(比如 CTHAR)才能使用,感觉很奇怪, 为什么呢,有哪位大神能给个提示呢?
unicode 乱码

------解决方案--------------------
引用:
Quote: 引用:

管你需要宽还是unicode
都可以任意转换的啊
unicode下  CString是单字节的  CStringW宽字节

任意转换是什么意思?如果我用CBUTTON::create创建一个自定义按钮呢,这个create有没有另外指定的单字节函数还是宽字节函数?
在unicode下  create 的参数  L"名称"  就行了
------解决方案--------------------
强调使用UNICODE编译

#ifndef UNICODE
#define UNICODE
#endif

#ifdef UNICODE
#ifndef _UNICODE
#define _UNICODE
#endif
#endif

TCHAR是个灵活性很强的东西,在UNICODE编码中,它被当作WCHAR,但在ANSI编码中,它又被当作CHAR:

#ifdef UNICODE
#define WCHAR TCHAR
#else
#define CHAR TCHAR
#endif

当你传参,如果从W版->A版,必须W2C(参数)再传递,反过来一样,经C2W(参数)再传递,否则,乱码。
------解决方案--------------------
WIN2000起,内核都使用UNICODE编码了,所以,现在的WINDOWS编程基本上都是使用宽字符了。如果在编程过程中,统一使用UNICODE编码,就不会出现乱码的情况。如果确实需要实现W版和A版,实现上只需要实现W版就可以了。A版的实现接受CHAR参数,然后转换成WCHAR传递给W版函数来执行即可。

#ifdef UNICODE
    #define test testW
#else
    #define test testA
#endif

VOID testW(WCHAR *wszStr)
{
    MessageBox(wszStr);
}

VOID testA(CHAR *szStr)
{
    WCHAR *wszStr = C2W(szStr);
    testW(wszStr);
}

当然,你可以只写一个版本的函数:

VOID test(TCHAR *szStr)
{
    MessageBox(szStr);
}

这个时候,在UNICODE编码中,它被当作WCHAR,但在ANSI编码中,它又被当作CHAR。
不过,当你把使用UNICODE和ANSI编译的组件共用时,就得非常小心,参数的传递必须经宽字符<=>多字节字符转换后再传递,否则乱码。
当然,TCHAR是过度之用,不如直接使用WCHAR。