要在我的程序中编码Unicode / UTF-8字符,我一直在使用\uXXXX
转义序列,例如:
wchar_t superscript_4 = L'\u2074'; // U+2074 SUPERSCRIPT 4 '⁴'
wchar_t subscript_4 = L'\u2084'; // U+2084 SUBSCRIPT 4 '₄'
但是,使用十六进制应该可以正常工作,因为Unicode是以十六进制编码的。
wchar_t superscript_4 = 0x2074;
wchar_t subscript_4 = 0x2084;
第二个例子会正确编码字符吗?我会遇到宽字符问题,分段错误或错误存储的字符值吗?如果是这样,为什么?如果没有,为什么?
答案 0 :(得分:1)
您可以使用十六进制常量初始化它们,但您也可以使用数字常量初始化常规char
,例如char c = 67;
。它的工作方式相同;它会分配char
或wchar_t
具有该int
的值的任何内容。在你给出的例子中,假设一个Unicode执行环境(不太保证,但非常可能),它的下标或上标4;在我的例子中,它是一个大写C
。
In particular,对于常规char
,技术上的字符常量如'C'
的类型为int
,您通常会将int
值分配给{{1} }}秒。对于char
s,常量确实具有wchar_t
类型,并且整数值与调用mbtowc
时获得的值相同。因此,假设您在Unicode环境中工作,则十六进制常量等同于Unicode转义。
但通常你不想这样做;使用字符文字可以更清楚地表达您的意图。如果在源代码中使用非ASCII字符,则尤其如此,在这种情况下,您可以将代码设为
wchar_t
另请注意,出于多种目的,最好使用wchar_t superscript_4 = L'⁴'
wchar_t subscript_4 = L'₄'
或char16_t
,因为char32_t
在不同平台上可以有不同的宽度;在你特别需要切换到别的东西之前,使用UTF-8也可能更干净。