猿问

C+11中字符串文字的Unicode编码

C+11中字符串文字的Unicode编码

跟随相关问题,我想问一下C+11中的新字符和字符串文字类型。现在看来,我们有四种字符和五种字符串文字。字符类型:


char     a =  '\x30';         // character, no semantics

wchar_t  b = L'\xFFEF';       // wide character, no semantics

char16_t c = u'\u00F6';       // 16-bit, assumed UTF16?

char32_t d = U'\U0010FFFF';   // 32-bit, assumed UCS-4

和字符串文字:


char     A[] =  "Hello\x0A";         // byte string, "narrow encoding"

wchar_t  B[] = L"Hell\xF6\x0A";      // wide string, impl-def'd encoding

char16_t C[] = u"Hell\u00F6";        // (1)

char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)

auto     E[] = u8"\u00F6\U0010FFFF"; // (3)

问题是:\x/\u/\U字符引用可与所有字符串类型自由组合?是否所有字符串类型都是固定宽度的,即数组包含的元素与文字中显示的元素相同,或者\x/\u/\U引用被扩展成一个可变的字节数?做u""和u8""字符串具有编码语义,例如,我可以说char16_t x[] = u"\U0010FFFF",而非BMP码点被编码成两个单元的UTF 16序列?也同样适用于u8?在(1)中,我可以用\u?最后,是否有任何编码字符串函数(即它们是字符感知的,并且可以检测无效的字节序列)?


这是一个开放的问题,但我想尽可能完整地了解新的C+11的新UTF编码和类型工具。


哆啦的时光机
浏览 708回答 2
2回答

蝴蝶刀刀

\x/\u/\u字符引用可以与所有字符串类型自由组合吗?没有。\x可以用于任何事情,但是\u和\U只能在特定UTF编码的字符串中使用。但是,对于任何UTF编码的字符串,\u和\U你认为合适就可以使用。是否所有字符串类型都是固定宽度的,即数组包含的元素与文字中所显示的一样多,还是将\x/\u/\u引用展开成一个可变的字节数?不是你的意思。\x, \u,和\U基于字符串编码进行转换。这些“代码单位”的数量(使用Unicode术语)。一个char16_t是一个UTF-16代码单元)值取决于包含字符串的编码。文字u8"\u1024"将创建包含2的字符串。charS加上空终止符。文字u"\u1024"将创建包含1的字符串。char16_t加上一个空终止符。使用的代码单元数基于Unicode编码。u“和U8”字符串是否具有编码语义,例如,是否可以说char16tx[]=u“\u0010FFFF”,而非BMP编码点被编码成两个单元的UTF 16序列?u""创建一个UTF-16编码字符串。u8""创建一个UTF-8编码字符串。它们将按照Unicode规范进行编码。在(1)中,我可以用\u写单独的代孕词吗?绝对不是。该规范明确禁止使用utf-16代理项对(0xD8000xDFff)作为代码点。\u或\U.最后,是否有任何编码字符串函数(即它们是字符感知的,并且可以检测无效的字节序列)?绝对不是。好吧,请允许我换个说法。std::basic_string不处理Unicode编码。他们当然可以商店被编码的字符串。但他们只能把它们看作是char, char16_t,或char32_t他们不能把它们看作是用特定机制编码的Unicode码点序列。basic_string::length()将返回代码单位的数量,而不是代码点。显然,C标准库字符串函数是完全无用的。但是,应该注意的是,Unicode字符串的“长度”并不意味着代码点的数量。一些代码点正在组合“字符”(一个不幸的名称),这与以前的代码点结合在一起。因此,多个编码点可以映射到单个视觉字符。实际上,IoStreams可以读写Unicode编码的值。要做到这一点,您必须使用区域设置来指定编码,并将其正确地注入到不同的位置。这说起来容易做起来难,而且我没有任何代码向你展示如何做到这一点。

人到中年有点甜

在C11中,\x不能与任何东西一起使用,例如U+1F984将不能使用\x前缀,并且\u和\U不能与ASCII控制字符一起使用,至少在Clang中是这样。
随时随地看视频慕课网APP
我要回答