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; 

第二个示例是否会正确编码字符?我会遇到宽字符问题,分段错误或不正确存储的字符值吗?如果是这样,为什么?如果不是,为什么?

+0

就我所知,第一个例子定义了一个大于CHAR_MAX的字符字面值。这本身就很糟糕...... – rubenvb

+0

你试过'L'\ u2074''而不是''\ u2074''吗? –

+0

@rubenvb哎呀,有一个错字。固定(每Keine的评论)。 –

可能用十六进制常量初始化它们,但你也可以用数字常量初始化正常的char,例如, char c = 67;。它以同样的方式工作。它分配任何charwchar_t具有该值int。在你给出的例子中,假设一个Unicode执行环境(不是很有保证但很有可能)是下标或上标4;在我的例子中,它是一个首都C

In particular,定期char S,像'C'技术上字符常量具有类型int,你通常分配intchar秒。对于wchar_t s,常量确实具有wchar_t类型,并且积分值与通过调用mbtowc获得的值相同。所以假设你在Unicode环境下工作,十六进制常量等同于Unicode转义。

通常你不想这样做,但;使用字符文字可以更清楚地表达你的意图。如果您在源代码中使用非ASCII字符,在这种情况下,你可以使代码只是

wchar_t superscript_4 = L'⁴' 
wchar_t subscript_4 = L'₄' 

另外请注意,在很多场合,最好使用char16_tchar32_t这是尤其如此,因为wchar_t能在不同的平台上有不同的宽度;在使用UTF-8之前,它可能也会更清洁,除非您有特定需要切换到别的东西。

+0

因此用十六进制常量初始化它们*会做同样的事情吗? (我读了你的答案,我同意第二句,我只是好奇。) –

+2

@MDXF它的确如此,假设执行环境是Unicode。理论上,执行环境可以使用一些多字节的非Unicode字符集,在这种情况下,Unicode转义符仍然可以工作(如果执行字符集有正确的字符),但是十六进制常量不会;在实践中,执行环境将是Unicode,这不会成为问题。 –