Unicode转义序列与十六进制值

时间:2017-08-14 21:17:05

标签: c unicode utf-8 hex widechar

要在我的程序中编码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;

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

1 个答案:

答案 0 :(得分:1)

可以使用十六进制常量初始化它们,但您也可以使用数字常量初始化常规char,例如char c = 67;。它的工作方式相同;它会分配charwchar_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也可能更干净。