C++ 使用C++;2018年?

C++ 使用C++;2018年?,c++,unicode,C++,Unicode,我已经尝试搜索stackoverflow来找到答案,但我找到的问题和答案都在10岁左右,由于变化和可能的进展,我似乎无法在这个问题上找到共识 据我所知,stl之外有几个库应该处理unicode- stl(,)包含了一些功能,但人们似乎对使用UTF-16持矛盾态度,因为他们处理的是UTF-16,该网站()表示不应使用UTF-16,许多在线用户似乎同意这一前提 我唯一想要的是能够用unicode字符串做4件事- 将字符串读入内存 使用unicode或ascii使用正则表达式搜索字符串,使用

我已经尝试搜索stackoverflow来找到答案,但我找到的问题和答案都在10岁左右,由于变化和可能的进展,我似乎无法在这个问题上找到共识

据我所知,stl之外有几个库应该处理unicode-

stl(,)包含了一些功能,但人们似乎对使用UTF-16持矛盾态度,因为他们处理的是UTF-16,该网站()表示不应使用UTF-16,许多在线用户似乎同意这一前提

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

  • 将字符串读入内存
  • 使用unicode或ascii使用正则表达式搜索字符串,使用ascii+unicode数字或字符连接或进行文本替换/格式化
  • 将不符合ascii范围的字符转换为ascii+unicode数字格式
  • 将字符串写入磁盘或发送到任何位置
  • 据我所知,icu可以处理这件事,甚至更多。我想知道的是,在Linux、Windows和MacOS上是否有标准的处理方法


    谢谢您的时间。

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


      大多数C++程序/程序员只是假设文本是一个几乎不透明的字节序列。UTF-8可能为此感到内疚,因此许多评论的回复也就不足为奇了:不用担心Unicode,只需处理UTF-8编码的字符串即可

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

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

      这仅仅意味着多达3个连续的unicode代码点可以表示一个字形。。。因此,一个字符就是一个字符的想法仍然是一个近似值

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


    BTW:甚至其他一些类似Python的语言,它们假装有一个原生Unicode支持(比目前的C++更优秀),在某些方面失败了:

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

    这样,Unicode的支持在10年内就不好了,我真的不希望在未来的10年里事情会好得多……

    “大多数C++程序/程序员只是假设一个文本是一个几乎不透明的字节序列”——怎么会这样呢?“文本”是什么意思?“文本”=任何在
    std::string
    (不是wstring)中或指向
    std::string\u视图的内容。实际上,您不必知道如何解释八位字节来进行复制、移动或调用,如regexp匹配等,其他人的代码将考虑任何Unicode因素。我倾向于使用boost中的本地化函数。他们在处理类似的东西方面做得相当好,即使你需要挖掘一下。我对此发表了一些想法,我的观点是Windows和MacOS有不错的(但不同的)Unicode支持,你可能想在一些API后面抽象出来,而(AFAIK)Linux没有。或者你可以去重症监护室。我从未使用过它,但从API文档来看,它看起来相当不错。Win32 API中不支持正则表达式,因此您可能会被迫使用它。您的答案可能在这篇文章中:-)