Unicode转义序列VS十六进制的
进行Unicode/UTF-8字符在我的计划,我一直在使用\uXXXX
转义序列,如:Unicode转义序列VS十六进制的
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;
第二个示例是否会正确编码字符?我会遇到宽字符问题,分段错误或不正确存储的字符值吗?如果是这样,为什么?如果不是,为什么?
你可能用十六进制常量初始化它们,但你也可以用数字常量初始化正常的char
,例如, char c = 67;
。它以同样的方式工作。它分配任何char
或wchar_t
具有该值int
。在你给出的例子中,假设一个Unicode执行环境(不是很有保证但很有可能)是下标或上标4;在我的例子中,它是一个首都C
。
In particular,定期char
S,像'C'
技术上字符常量具有类型int
,你通常分配int
值char
秒。对于wchar_t
s,常量确实具有wchar_t
类型,并且积分值与通过调用mbtowc
获得的值相同。所以假设你在Unicode环境下工作,十六进制常量等同于Unicode转义。
通常你不想这样做,但;使用字符文字可以更清楚地表达你的意图。如果您在源代码中使用非ASCII字符,在这种情况下,你可以使代码只是
wchar_t superscript_4 = L'⁴'
wchar_t subscript_4 = L'₄'
另外请注意,在很多场合,最好使用char16_t
或char32_t
这是尤其如此,因为wchar_t
能在不同的平台上有不同的宽度;在使用UTF-8之前,它可能也会更清洁,除非您有特定需要切换到别的东西。
因此用十六进制常量初始化它们*会做同样的事情吗? (我读了你的答案,我同意第二句,我只是好奇。) –
@MDXF它的确如此,假设执行环境是Unicode。理论上,执行环境可以使用一些多字节的非Unicode字符集,在这种情况下,Unicode转义符仍然可以工作(如果执行字符集有正确的字符),但是十六进制常量不会;在实践中,执行环境将是Unicode,这不会成为问题。 –
就我所知,第一个例子定义了一个大于CHAR_MAX的字符字面值。这本身就很糟糕...... – rubenvb
你试过'L'\ u2074''而不是''\ u2074''吗? –
@rubenvb哎呀,有一个错字。固定(每Keine的评论)。 –