gpt4 book ai didi

c++ - 2018 年使用 C++ 处理 Unicode 的正确方法?

转载 作者:IT老高 更新时间:2023-10-28 12:51:56 27 4
gpt4 key购买 nike

我已尝试搜索 stackoverflow 以找到此问题的答案,但我发现的问题和答案大约有 10 年的历史,由于更改,我似乎无法就该主题达成共识以及可能的进展。

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

包含了 STL 的一些功能(wstringcodecvt_utf8),但人们似乎对使用感到矛盾,因为他们处理的是 UTF-16,这个网站:(utf-8 everywhere)说应该'不被使用,网上很多人似乎都同意这个前提。

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

  1. 将字符串读入内存
  2. 使用 unicode 或 ascii 使用正则表达式搜索字符串,使用 ascii+unicode 数字或字符连接或进行文本替换/格式化。
  3. 将不适合 ascii 范围的字符转换为 ascii + unicode 数字格式。
  4. 将字符串写入磁盘或发送到任何地方。

据我所知,icu 可以处理这个以及更多问题。我想知道的是在 Linux、Windows 和 MacOS 上是否有标准的处理方式。

感谢您的宝贵时间。

最佳答案

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

  • 大多数 C++ 程序/程序员只是假设文本是几乎不透明的字节序列。 UTF-8 可能对此感到内疚,并且许多评论恢复到以下内容也就不足为奇了:不要担心 Unicode,只需处理 UTF-8 编码的字符串

  • 文件只包含字节。目前,如果您尝试在内部处理真正的 Unicode 代码点,您将不得不将其序列化为字节 -> 在这里,UTF-8 再次胜出

  • 一旦你走出基本多语言平面(16 位代码点),事情就会变得越来越复杂。 emoji处理起来特别糟糕:一个表情符号后面可以跟一个 变体选择器(U+FE0E VARIATION SELECTOR-15 (VS15) 用于文本或 U+FE0F VARIATION SELECTOR-16 (VS16) 用于表情符号样式) 来改变它的显示风格,或多或少是旧的 i bs ^,它在 1970 年 ascii 中使用,当时人们想打印 î。这还不是全部,字符 U+1F3FB 到 U+1F3FF 用于为分布在六个 block 中的 102 个人类表情符号提供肤色:标志、表情符号、杂项符号、杂项符号和象形文字、补充符号和象形文字以及运输和 map 符号。

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

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


顺便说一句:即使是其他语言,如 Python,它们假装支持原生 unicode(恕我直言,这比当前的 C++ 好得多)也经常在某些方面失败:

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

所以十多年来对 Unicode 的支持很差,我真的不希望在接下来的 10 年里事情会变得更好......

关于c++ - 2018 年使用 C++ 处理 Unicode 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50613451/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com