wchar_t到无符号字符转换
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 相同。 您不是在使用非 ASCII 字符集(IBM 的 Z 系列大型机,为了向后兼容而默认为代码页 1047)的现代实际编译器上编译此代码,因此编译器将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'
.
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 字符转换功能 std::isupper() & std::islower() C++17
- 将字符 * 转换为字符串 *
- 在编译时将常量字符* 转换为常量 char_type*
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 无法使用字符串流将字符转换为字符串C++
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法<string>从"常量字符 []"转换为<类名>
- 不能将字符转换为整数吗?
- 编译时将字符*转换为字节
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 将单个字符转换为 std::string 前缀 \x01
- PPM 将字符转换为 int 授予负数
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 将常量字符* 转换为字符时出错