1

假设我有一个 unicode 字符wchar_t x;

当然,转换x为 ASCII 的明显方法是使用wctob函数

但我想知道,由于Unicode 的前 255 个字符与 ASCII 相对应,那么演员表char是否可以跨平台始终如一地工作?

char c = (char) x ; // cast to char, this works on Windows

问题是,演员会char保证保留低阶位,还是可能保留高阶位?(我担心这里的小端/大端情况,虽然我意识到如果它适用于我的小端系统,它肯定应该适用于大端系统)。

4

3 回答 3

4

为了简洁起见,我松散地使用了一些术语。为避免混淆,强烈建议至少仔细研究以下术语的定义:ASCII、Unicode、UCS、UCS-2、UCS-4、UTF、UTF-8、UTF-16、UTF-32、字符、字符集,编码字符集,曲目,代码单元

字符“Q”的代码在 ASCII 和 Unicode 中都是 81。

81 只是一个整数,就像任何其他整数一样。变量可以char存储数字 81。wchar_t变量可以存储相同的数字 81。在这两种情况下,我们都将 81解释为“Q”。

long询问数字 81 在从 eg转换为时如何保留没有多大意义short。如果它适合,那么你就准备好了。没有字节序或更高位或更低位或任何涉及的这些东西。

当您通过网络转换存储字符或字节流的文件时,字节顺序和位和东西开始变得重要,就像存储(二进制表示)任何旧数字的文件一样。

于 2012-12-26T05:40:38.747 回答
1

如果x不适合 a char,则该行为是正式的“实现定义的”并允许发出信号。如果x确实适合 a char,则保留该值(无论字节顺序如何)。

6.3.1.3 有符号和无符号整数

(1) 当一个整数类型的值转换为除 以外的其他整数类型_Bool时,如果该值可以用新的类型表示,则保持不变。

(2) [此处不适用]

(3) 否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

为了获得最大的可移植性,首先执行范围检查,并且仅当值在范围内时才强制SCHAR_MIN转换为SCHAR_MAX.

(其他人已经注意到,我想重复一下,ASCII 仅扩展到字符 127。)

于 2012-12-26T13:19:13.847 回答
0

我的印象是,在这种情况下,系统的字节序无关紧要。

我在这里找到了一个很好的解释。我认为这应该有助于消除你对选角的恐惧。

于 2012-12-26T05:20:52.580 回答