wchar_t 到 unsigned char 转换

wchar_t to unsigned char conversion

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

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

我知道您在从 Unicode(wchar_t 数据类型)转换为 ANSI(无符号字符)时可能会丢失一些数据(从 16 位到 8 位)。但是,有人可以解释为什么减去“0”可以使此转换正确吗?

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

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

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

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