我尝试过搜索 stackoverflow 来找到这个问题的答案,但我发现的问题和答案都在10岁由于变化和可能的进展,我似乎无法就该主题达成共识。
我知道除了 stl 之外还有几个库应该处理 unicode-
- http://userguide.icu-project.org/ http://userguide.icu-project.org/
- https://github.com/nemtrif/utfcpp https://github.com/nemtrif/utfcpp
- https://github.com/CaptainCrowbar/unicorn-lib https://github.com/CaptainCrowbar/unicorn-lib
stl 有几个特点(wstring https://stackoverflow.com/questions/27225196/is-wstring-character-is-unicode-what-happens-during-conversion,编码cvt_utf8 http://en.cppreference.com/w/cpp/locale/codecvt_utf8),但人们似乎对使用持矛盾态度,因为他们处理的是 UTF-16,这个网站:(到处都是 utf-8 https://utf8everywhere.org/)说不应该使用,网上很多人似乎都同意这个前提。
我唯一想要的就是能够用 unicode 字符串做 4 件事 -
- 将字符串读入内存
- 使用 unicode 或 ascii 通过正则表达式搜索字符串,使用 ascii+unicode 数字或字符连接或进行文本替换/格式化。
- 对于不适合 ascii 范围的字符,转换为 ascii + unicode 数字格式。
- 将字符串写入磁盘或发送到任何地方。
据我所知,重症监护室可以处理这个问题以及更多事情。我想知道在 Linux、Windows 和 MacOS 上是否有处理此问题的标准方法。
感谢您的时间。
我将尝试在这里提出一些想法:
-
大多数 C++ 程序/程序员只是假设文本是几乎不透明的字节序列。 UTF-8 可能因此而有罪,毫不奇怪,许多评论继续这样说:不用担心 Unicode,只需处理 UTF-8 编码的字符串
-
文件仅包含字节。此时,如果您尝试在内部处理真正的 Unicode 代码点,则必须将其序列化为字节 -> 这里再次 UTF-8 获胜
-
一旦走出基本多语言平面(16 位代码点),事情就会变得越来越复杂。这emoji https://en.wikipedia.org/wiki/Emoji处理起来特别糟糕:表情符号后面可以跟着一个变体选择器(U+FE0E VARIATION SELECTOR-15 (VS15) 用于文本或 U+FE0F VARIATION SELECTOR-16 (VS16) 用于表情符号样式)更改其显示样式,或多或少是旧的i bs ^
1970 年当人们想要打印时使用了 asciiî
。这还不是全部,字符 U+1F3FB 到 U+1F3FF 用于为分布在六个块中的 102 个人类表情符号提供肤色:标志、表情符号、杂项符号、杂项符号和象形文字、补充符号和象形文字以及运输和地图符号。
这仅仅意味着最多 3 个连续的 unicode 代码点可以表示一个单独的字形......所以一个字符就是一个字符的想法char32_t
仍然是一个近似值
我的结论是 Unicodeis一个复杂的事情,确实需要像 ICU 这样的专用库。当你只处理BMP时,你可以尝试使用简单的工具,比如标准库的转换器,但全面支持远远不止于此。
顺便说一句:即使是像 Python 这样的其他语言,假装拥有本机 unicode 支持(恕我直言,这比当前的 C++ 好得多)也经常在某些方面失败:
- tkinter GUI 库无法显示 BMP 之外的任何代码点 - 尽管它是标准的 IDLE Python 工具
- 除了核心语言支持(编解码器和 unicodedata)之外,不同的模块或标准库专用于 Unicode,并且 Python 包索引中提供了其他模块(例如表情符号支持),因为标准库不能满足所有需求
所以 10 多年来对 Unicode 的支持一直很差,我真的不希望未来 10 年内事情会变得更好......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)