【问题标题】:What is the point of the UTF-8 character literals proposed for C++17?为 C++17 提议的 UTF-8 字符文字有什么意义?
【发布时间】:2015-11-05 08:26:14
【问题描述】:

N4267 提出的这些究竟有什么意义?

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

(实际上我也不完全确定我是否理解对 UTF-8 字符串文字的需求。我猜这是编译器担心使用 Unicode 字符串加上对 Unicode 的验证做奇怪/模棱两可的事情?)

【问题讨论】:

  • 啊,非常感谢那个链接,我确实找到了这个问题,但显然我没有向下滚动!这是有道理的,所以基本上只是为了保证一个字符是ASCII?这是一个相当糟糕的名字,在这种情况下,我必须说!似乎是巧合而不是设计的功能......
  • 我经常在接受的答案中找不到我正在寻找的答案,而且我经常不得不走到答案的中间才能找到它。这可能有很多原因,在某些情况下,好的答案通常会迟到或几个月或几年后。
  • 我认为他们应该停止对语言做这种事情。有人转发他们 utf8everywhere.org

标签: c++ unicode utf-8 c++17


【解决方案1】:

Evolution Working Group issue 119: N4197 Adding u8 character literals, [tiny] Why no u8 character literals? 涵盖了基本原理,它跟踪了提案并说:

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

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

char x_ascii = { u'x' };

...如果代码点不适合,我们将得到一个缩小错误 一个“字符”。 (请注意,这与 u8'x' 不太一样,后者将 如果代码点不能表示为单个,则给我们一个错误 UTF-8 编码单元。)

【讨论】:

  • 也许您还应该提到,如果 u8 需要几个字节,则它的格式不正确(根据您在评论中的链接)。我认为这是最大的好处,因为现在写 if (c=='ç') 之类的东西似乎可以工作,但实际上可能不会给出预期的结果(或者因为源文件的编码错误,或者因为只使用了第一个字节,而 u8'ç ' 会引发一个错误,表明这里存在真正的问题。
  • @Christophe 好点,更新的答案也包括该部分。
  • 干杯,这显然是正确的答案。我不太在意它,因为有一个前缀表示“UTF-8”实际上只接受 ASCII 似乎非常违反直觉,但我认为它比替代方案更好。谢谢!
猜你喜欢
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 2017-03-04
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2020-02-15
相关资源
最近更新 更多