wchar_t到unsigned char转换

时间:2018-03-05 01:00:52

标签: c++ c unicode ansi

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

unsigned char charStr; //this var can only take a value either 0, 1, or 2
WCHAR wcharStr;
...
charStr = wcharStr - '0';
...

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

1 个答案:

答案 0 :(得分:6)

C和C ++语言标准要求09的数字编码是连续的。因此,例如,减去'4' - '0'会得到4

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

此代码不正确。如果您要从unsigned char转换为wchar_t,则应使用STL中的char或C标准库中的codecvt。当且仅当可能时,还有wcrtomb()转换为单个字节。在使用之前设置您的语言环境。

如果您确定wctob()拥有Unicode,wchar_t拥有Latin-1,并且您的值在范围内,则可以简单地转换unsigned char值到wchar_t。另一种方法,如果你知道你有一个数字,就是写(unsigned char)