[英]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编码的字符串。 但他们只能将它们视为char
, char16_t
或char32_t
序列; 他们不能将它们视为使用特定机制编码的Unicode代码点序列。 basic_string::length()
将返回代码单元的数量,而不是代码点。 显然,C标准库字符串函数完全没用
然而,应该注意,Unicode字符串的“长度”并不意味着代码点的数量。 一些代码点组合了“字符”(一个不幸的名称),它与前一个代码点结合在一起。 因此,多个代码点可以映射到单个视觉角色。
Iostream实际上可以读/写Unicode编码的值。 为此,您必须使用区域设置来指定编码并将其适当地添加到各个位置。 这说起来容易做起来难,而且我没有任何代码可以告诉你如何。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.