在2018年用C ++处理Unicode的正确方法?

时间:2018-05-30 21:16:20

标签: c++ unicode

我已经尝试过搜索stackoverflow来找到答案,但我发现的问题和答案都在 10岁,我似乎无法就此问题达成共识和可能的进展。

我知道在stl之外有几个库应该处理unicode -

stl(wstringcodecvt_utf8)有一些功能,但人们似乎对使用感到矛盾,因为他们处理UTF-16这个网站:{{3 }})表示不应该使用,许多人在网上似乎同意这个前提。

我唯一想要的是能够用unicode字符串做4件事 -

  1. 将字符串读入内存
  2. 使用unicode或ascii搜索带有正则表达式的字符串,连接或使用ascii + unicode数字或字符进行文本替换/格式化。
  3. 转换为ascii + unicode数字格式,表示不适合ascii范围的字符。
  4. 将字符串写入磁盘或发送到任何地方。
  5. 从我可以告诉icu处理这个以及更多。我想知道的是,如果在Linux,Windows和MacOS上有一种标准的处理方式。

    感谢您的时间。

1 个答案:

答案 0 :(得分:12)

我会尝试在这里提出一些想法:

  • 大多数C ++程序/程序员只是假设文本是几乎不透明的字节序列。 UTF-8可能对此感到内疚,并且毫不奇怪,很多评论都恢复到:不用担心Unicode,只处理UTF-8编码的字符串
  • 文件只包含字节。在某个时刻,如果您尝试在内部处理真正的Unicode代码点,则必须将其序列化为字节 - > UTF-8再次赢得积分
  • 一旦你离开基本多语言平面(16位代码点),事情就会变得越来越复杂。 emoji特别难以处理:表情符号后面可以跟一个变体选择器(U + FE0E VARIATION SELECTOR-15(VS15)用于文本或U + FE0F VARIATION SELECTOR-16( VS16)用于表情符号式)改变其显示风格,或多或少是1970年ascii用于打印i bs ^时使用的旧î。不仅如此,字符U + 1F3FB到U + 1F3FF用于为跨越六个块的102个人类表情符号提供肤色:标志,表情符号,杂项符号,杂项符号和象形文字,补充符号和象形文字,和运输和地图符号。

    这仅仅意味着最多3个连续的unicode代码点可以代表一个单一的字形......所以一个字符是一个char32_t的想法仍然是近似值

我的结论是Unicode 是一件复杂的事情,而且确实需要一个像ICU这样的专用库。当您只处理BMP时,您可以尝试使用标准库转换器之类的简单工具,但完全支持远不止于此。

BTW:甚至其他像Python这样的假装有本地unicode支持的语言(恕我直言,比当前的C ++更好)在某些方面失败了:

  • tkinter GUI库无法显示BMP之外的任何代码点 - 虽然它是标准的IDLE Python工具
  • 除了核心语言支持(编解码器和unicodedata)之外,不同的模块或标准库专用于Unicode,并且Python包索引中提供了其他模块,如表情符号支持,因为标准库不能满足所有需求< / LI>

因此,对Unicode的支持已经超过10年了,我真的不希望未来10年内情况会好转......