繁体   English   中英

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

[英]Unicode encoding for string literals in C++11

在一个相关的问题之后 ,我想问一下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\u003c/code> / \\U字符引用是否可以与所有字符串类型自由组合? 所有字符串类型都是固定宽度的,即数组包含与文字中出现的元素一样多的元素,或者\\x / \\u\u003c/code> / \\U引用是否扩展为可变数量的字节? u""u8""字符串是否具有编码语义,例如我可以说char16_t x[] = u"\\U0010FFFF" ,非BMP代码点被编码为两个单元的UTF16序列? 对于u8同样如此? 在(1)中,我可以用\\u\u003c/code>编写单独的代理人吗? 最后,是否有任何编码感知的字符串函数(即它们是字符感知的并且可以检测无效的字节序列)?

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

\\ x / \\ u / \\ U字符引用是否可以与所有字符串类型自由组合?

编号\\x可用于任何内容,但\\u\u003c/code>和\\U只能用于特别是UTF编码的字符串。 但是,对于任何UTF编码的字符串,可以根据需要使用\\u\u003c/code>和\\U

所有字符串类型都是固定宽度的,即数组包含与文字中出现的元素一样多的元素,或者\\ x / \\ u / \\ U引用是否扩展为可变数量的字节?

不是你的意思。 \\x\\u\u003c/code>和\\U基于字符串编码进行转换。 这些“代码单元”的数量(使用Unicode术语char16_t是UTF-16代码单元)值取决于包含字符串的编码。 文字u8"\ဤ"将创建一个包含2个char加上空终止符的字符串。 文字u"\ဤ"将创建一个包含1个char16_t和一个空终止符的字符串。

使用的代码单元数基于Unicode编码。

u“”和u8“”字符串是否具有编码语义,例如我可以说char16_t x [] = u“\\ U0010FFFF”,非BMP代码点被编码为两个单元的UTF16序列?

u""创建一个UTF-16编码的字符串。 u8""创建一个UTF-8编码的字符串。 它们将按照Unicode规范进行编码。

绝对不。 该规范明确禁止使用UTF-16代理对(0xD800-0xDFFF)作为\\u\u003c/code>或\\U代码点。

最后,是否有任何编码感知的字符串函数(即它们是字符感知的并且可以检测无效的字节序列)?

绝对不。 好吧,请允许我重新说一下。

std::basic_string不处理Unicode编码。 它们当然可以存储 UTF编码的字符串。 但他们只能将它们视为charchar16_tchar32_t序列; 他们不能将它们视为使用特定机制编码的Unicode代码点序列。 basic_string::length()将返回代码单元的数量,而不是代码点。 显然,C标准库字符串函数完全没用

然而,应该注意,Unicode字符串的“长度”并不意味着代码点的数量。 一些代码点组合了“字符”(一个不幸的名称),它与前一个代码点结合在一起。 因此,多个代码点可以映射到单个视觉角色。

Iostream实际上可以读/写Unicode编码的值。 为此,您必须使用区域设置来指定编码并将其适当地添加到各个位置。 这说起来容易做起来难,而且我没有任何代码可以告诉你如何。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM