为C++ 17提出的UTF-8字符文字有什么意义?

Muz*_*zer 22 c++ unicode utf-8 c++17

N4267提出的具体问题究竟是什么?

它们唯一的功能似乎是防止指定扩展的ASCII字符或部分UTF-8代码点.它们仍然存储在一个固定宽度的8位字符(根据我的理解,这是几乎所有用例中处理UTF-8的正确和最佳方式),因此它们不支持非ASCII字符所有.到底是怎么回事?

(实际上我并不完全确定我理解UTF-8字符串文字的需要.我想这是编译器担心Unicode字符串加上Unicode验证的奇怪/模糊事物的担心吗?)

Sha*_*our 18

基本原理是由覆盖演进工作组的问题119:N4197添加U8字符文字,[微小的]为什么没有U8字符文字?跟踪提案并说:

我们有五个用于字符串文字的编码前缀(无,L,u8,u,U),但只有四个用于字符文字 - 缺少的是字符文字的u8.

这对于窄执行字符集不是ASCII的实现很重要.在这种情况下,u8字符文字将提供一种理想的方法来编写具有保证ASCII编码的字符文字(单代码单元u8编码完全是ASCII),但是......我们不提供它们.相反,最好的可以做的是这样的:

char x_ascii = { u'x' };
Run Code Online (Sandbox Code Playgroud)

...如果代码点不适合'char',我们将得到一个缩小的错误.(请注意,这与u8'x'不完全相同,如果代码点无法表示为UTF-8中的单个代码单元,则会出现错误.)

  • 也许你还应该提一下,如果u8需要几个字节,它就会形成错误(根据评论中的链接).我认为这是最大的好处,因为现在编写类似于`if(c =='ç')的东西似乎有用但实际上可能没有给出预期的结果(或者因为源文件的编码错误,或者因为只有第一个使用了字节,而u8'ç'会引发一个错误,表明这里存在一个真正的问题. (3认同)
  • 干杯,这显然是正确的答案.我不太关心它,因为看起来非常违反直觉,意味着"UTF-8"实际上只接受ASCII,但我认为它比替代品更好.谢谢! (3认同)