为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
哆啦的时光机 2019-07-10 15:51:43
C+11中字符串文字的Unicode编码跟随相关问题,我想问一下C+11中的新字符和字符串文字类型。现在看来,我们有四种字符和五种字符串文字。字符类型:char     a =  '\x30';         // character, no semanticswchar_t  b = L'\xFFEF';       // wide character, no semanticschar16_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 encodingchar16_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编码和类型工具。
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

\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编码。他们当然可以商店被编码的字符串。但他们只能把它们看作是charchar16_t,或char32_t他们不能把它们看作是用特定机制编码的Unicode码点序列。basic_string::length()将返回代码单位的数量,而不是代码点。显然,C标准库字符串函数是完全无用的。

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

实际上,IoStreams可以读写Unicode编码的值。要做到这一点,您必须使用区域设置来指定编码,并将其正确地注入到不同的位置。这说起来容易做起来难,而且我没有任何代码向你展示如何做到这一点。


查看完整回答
反对 回复 2019-07-10
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

在C11中,\x不能与任何东西一起使用,例如U+1F984将不能使用\x前缀,并且\u\U不能与ASCII控制字符一起使用,至少在Clang中是这样。

查看完整回答
反对 回复 2019-07-10
  • 2 回答
  • 0 关注
  • 707 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信