关于宽字节和多字节的有关问题
关于宽字节和多字节的问题
我在一个项目中使用的 unicode字符集,并创建了一个自定义按钮,在但使用时, 发现其中一个类要使用自定义按钮时要多字节(比如char)才能显示按钮名称,否则出现乱码,另一个类则要使用宽字节(比如 CTHAR)才能使用,感觉很奇怪, 为什么呢,有哪位大神能给个提示呢?
------解决方案--------------------
在unicode下 create 的参数 L"名称" 就行了
------解决方案--------------------
强调使用UNICODE编译
TCHAR是个灵活性很强的东西,在UNICODE编码中,它被当作WCHAR,但在ANSI编码中,它又被当作CHAR:
当你传参,如果从W版->A版,必须W2C(参数)再传递,反过来一样,经C2W(参数)再传递,否则,乱码。
------解决方案--------------------
WIN2000起,内核都使用UNICODE编码了,所以,现在的WINDOWS编程基本上都是使用宽字符了。如果在编程过程中,统一使用UNICODE编码,就不会出现乱码的情况。如果确实需要实现W版和A版,实现上只需要实现W版就可以了。A版的实现接受CHAR参数,然后转换成WCHAR传递给W版函数来执行即可。
当然,你可以只写一个版本的函数:
这个时候,在UNICODE编码中,它被当作WCHAR,但在ANSI编码中,它又被当作CHAR。
不过,当你把使用UNICODE和ANSI编译的组件共用时,就得非常小心,参数的传递必须经宽字符<=>多字节字符转换后再传递,否则乱码。
当然,TCHAR是过度之用,不如直接使用WCHAR。
我在一个项目中使用的 unicode字符集,并创建了一个自定义按钮,在但使用时, 发现其中一个类要使用自定义按钮时要多字节(比如char)才能显示按钮名称,否则出现乱码,另一个类则要使用宽字节(比如 CTHAR)才能使用,感觉很奇怪, 为什么呢,有哪位大神能给个提示呢?
unicode
乱码
------解决方案--------------------
在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。