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

Lfo*_*fod 28 c++ unicode

我已经尝试搜索stackoverflow来找到答案,但我发现的问题和答案大约是10岁,由于变化和可能的进展,我似乎无法就该主题达成共识.

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

stl(wstring,codecvt_utf8)有一些功能,但人们似乎对使用感到矛盾,因为他们处理UTF-16这个网站:(utf-8无处不在)说不应该使用和许多人网上似乎同意这个前提.

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

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

从我可以告诉icu处理这个和更多.我想知道的是,在Linux,Windows和MacOS上有一种标准的处理方式.

感谢您的时间.

Ser*_*sta 13

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

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

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

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


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

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

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