wchar_t到unsigned char转换

ekr*_*mer 2 c c++ unicode ansi

我有一个代码实现以下内容:

unsigned char charStr; //this var can only take a value either 0, 1, or 2
WCHAR wcharStr;
...
charStr = wcharStr - '0';
...
Run Code Online (Sandbox Code Playgroud)

我知道在从Unicode(wchar_t数据类型)转换为ANSI(unsigned char)时可能会丢失一些数据(从16位到8位).但是,有人可以解释为什么减去'0'使这种转换正确吗?

Dav*_*lor 6

C和C++语言标准要求用于从数字的编码0,以9连续.因此,减去'4' - '0',例如,会得到你4.

这实际上并不需要wchar_t,但在现实世界中,您的编译器会将其映射到Unicode,Windows上的UTF-16或其他地方的UCS-4.Unicode的前128个代码点与ASCII相同.你不是编译使用非ASCII字符集(IBM的Z系列大型机,其默认为代码页1047为向后兼容),所以你的编译器转换你对一个现代的,现实世界的编译器的代码wchar_tchar一些整数类型,可能是32位宽,减去并获得一个数字值.然后它将它存储在一个类型的变量中unsigned char,这是一个错误,因为它实际上是一个不可打印的控制字符的ASCII值.

此代码不正确.如果要转换wchar_tchar,则应使用codecvtSTL或wcrtomb()C标准库.wctob()当且仅当可能时,还会转换为单个字节.在使用之前设置您的语言环境.

如果你确定你wchar_t拥有Unicode,你unsigned char持有Latin-1,并且你的值在范围内,你可以简单地将wchar_t值转换为(unsigned char).另一种方法,如果你知道你有一个数字,就是写(charStr - L'0') + '0'.