假设我在wchar_t x;
当然,将x
转换为ASCII的明显方法是使用wctob函数
但我想知道,自the first 255 characters of Unicode correspond with ASCII以来,char
的演员是否会在各个平台上持续发挥作用?
char c = (char) x ; // cast to char, this works on Windows
问题是,转换为char
会保证保持LOW ORDER位,还是可能保留HIGH ORDER位? (我关注这里的小端/大端情况,虽然我意识到它是否适用于我的小端系统,它肯定应该适用于大端系统)。
答案 0 :(得分:4)
为了简洁起见,我松散地使用了一些术语。为避免太多混淆,强烈建议仔细研究definitions至少以下术语: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”。
当询问从数字中投出数字81时,如何保留数字81没有多大意义。 long
到short
。如果它适合那么你就完成了。没有字节序或更高位或更低位或任何涉及的内容。
当您转换存储字符或网络字节流的文件时,字节顺序和位和内容开始变得重要,就像存储(二进制表示)任何旧数字的文件一样。
答案 1 :(得分:1)
如果x
不适合char
,则行为正式为“实现定义”,并允许发出信号。如果x
适合char
,则会保留该值(无论字节顺序如何)。
6.3.1.3有符号和无符号整数
(1)当整数类型的值转换为
_Bool
以外的另一个整数类型时,如果该值可以用新类型表示,则它不会改变。(2)[此处不适用]
(3)否则,新类型被签名,其值无法表示;结果是实现定义的,或者引发实现定义的信号。
为了获得最大的便携性,请先执行范围检查,并仅在值介于SCHAR_MIN
到SCHAR_MAX
范围内时进行投射。
(其他人已经注意到,我希望重复一遍,ASCII只扩展到127字符。)
答案 2 :(得分:0)
我的印象是系统的字节顺序在这种情况下并不重要。
我找到了一个非常好的explanation here。 我认为这应该有助于减轻你对铸造的恐惧。