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++ 语言标准要求从 0
到 9
的数字编码是连续的。因此,例如,减去 '4' - '0'
将得到 4
.
这对于 wchar_t
实际上不是必需的,但在现实世界中,您的编译器会将其映射到 Unicode,即 Windows 上的 UTF-16 或其他地方的 UCS-4。 Unicode 的前 128 个代码点与 ASCII 相同。您不是在使用 non-ASCII 字符集(IBM 的 Z-series 大型机,为了向后兼容而默认使用代码页 1047)的现代 real-world 编译器上编译此代码,因此您的编译器将你的 wchar_t
和 char
转换为某种整数类型,可能是 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'
.
我有一个实现以下内容的代码:
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++ 语言标准要求从 0
到 9
的数字编码是连续的。因此,例如,减去 '4' - '0'
将得到 4
.
这对于 wchar_t
实际上不是必需的,但在现实世界中,您的编译器会将其映射到 Unicode,即 Windows 上的 UTF-16 或其他地方的 UCS-4。 Unicode 的前 128 个代码点与 ASCII 相同。您不是在使用 non-ASCII 字符集(IBM 的 Z-series 大型机,为了向后兼容而默认使用代码页 1047)的现代 real-world 编译器上编译此代码,因此您的编译器将你的 wchar_t
和 char
转换为某种整数类型,可能是 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'
.