2018 年用 C++ 处理 Unicode 的正确方法是什么?

2024-01-10

我尝试过搜索 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 件事 -

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

据我所知,重症监护室可以处理这个问题以及更多事情。我想知道在 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(使用前将#替换为@)

2018 年用 C++ 处理 Unicode 的正确方法是什么? 的相关文章

随机推荐

  • 获取隐藏列时的最后一个列号

    我需要获取第二行的最后一个列号 而引用的列是隐藏的 如果隐藏最后一列 下面的代码将输出错误的结果 Sub Last column number even is hidden Dim ws As Worksheet lastCol n As
  • 从同一编译单元覆盖 C 中的函数调用

    我在尝试着重写 C 中的函数调用 https stackoverflow com questions 617554 override a function call in c 但是当该函数在同一编译单元中使用时 我遇到了问题 在下面的代码中
  • MBProgressHUD 和 UITableView

    我在填充 TableView 时显示 HUD 但它似乎显示在 TableView 后面 表视图分隔符破坏了 Hud 这是 TableViewController 中的代码 void viewDidLoad super viewDidLoad
  • 删除createMediaElementSource

    我已经用谷歌搜索了这个问题 但找不到任何东西 我现在的情况需要删除source createMediaElementSource这样我就可以再次创建它 我正在使用音频分析器 每次使用 ajax 加载指定曲目时都必须加载该分析器 一旦您转到另
  • 如何定义一个返回其自身类型的 Rust 函数类型?

    我正在学习 Rust 并且仍然非常努力地理解它 考虑以下 Go 定义 type FnType func paramType FnType 它只是一个返回相同类型的函数的函数 Rust 中可以实现类似的功能吗 而且 理想情况下 它可以通用地完
  • 抽象类中内部抽象方法的目的是什么?

    抽象类中内部抽象方法的目的是什么 为什么要在抽象类中创建一个内部抽象方法 如果我们想限制程序集外部的抽象类 为什么我们不直接创建抽象内部类 背后是否还有其他逻辑 Adding internal的成员public抽象类使得不可能继承它abst
  • 是否可以使用 pyscript 在浏览器上运行 pygame 制作的游戏?

    我使用 pygame 制作了一个小型太空入侵者游戏 我想知道是否可以使用 pyscript 在浏览器上玩它 这可能吗 我必须重写所有内容吗 不 PyScript 目前不支持 Pygame 我不确定找出哪些软件包的最佳方法是什么are支持 但
  • 无法授权 Azure LogAnalytics 工作区

    I am trying to connect to my workspace in the Azure Portal I am getting the error as 操作返回无效状态代码 未经授权 creds 对象已获取身份验证令牌 并
  • 隐藏用户输入

    我正在尝试获取一个既可以在本机 Windows shell 中也可以在 cygwin shell 通过 ssh 中运行的脚本 该脚本会提示并读取用户输入的密码 到目前为止 我已经尝试过以下方法 using Term ReadKey and
  • .wav 文件中的字节代表什么?

    当我将 wav 文件中的数据存储到字节数组中时 这些值意味着什么 我读到它们采用两字节表示形式 但是这些两字节值中到底包含什么 您可能听说过 音频信号是由某种波表示的 如果您曾经见过带有上下直线的波形图 这基本上就是这些文件中的内容 看看这
  • Laravel/Heroku,会话没有这样的文件或目录

    我正在尝试在 heroku 上运行我的应用程序 但对于某些请求 只有 POST GET 工作正常 我的 Ajax POST 请求出现以下错误 Error Request failed with status code 419 当我检查 He
  • SignalR - 如何在集线器中执行异步任务?

    我正在尝试使用 C 5 async await 功能创建 SignalR 应用程序 但每当运行代码时 它都会抛出 System InvalidOperationException 这是重现该问题的最简单的代码 public class Sa
  • Python ctypes 和可变性

    我注意到将 Python 对象传递给本机代码ctypes可以打破可变性预期 例如 如果我有一个 C 函数 如下所示 int print and mutate char str str 0 X return printf s n str 我这
  • AutoMapper - 使用相同的源和目标对象类型进行映射

    我使用 Automapper 获取两个相同类型的对象并映射已更改的任何新值 我尝试使用下面的代码 但它不断抛出错误 我什至不确定这是否可以通过 Automapper 来实现 例如 Mapper CreateMap
  • Web 开发人员应该了解 IE7 和 IE8 之间的主要区别是什么?

    我刚刚下载了 IE8 它取代了我的 IE7 但这没关系 因为 IE8 有一个 兼容性视图 旨在呈现像 IE7 一样的页面 不确定 JavaScript 我想知道互联网上是否列出了开发人员应该了解的版本之间的所有主要差异 我在谷歌上搜索了一下
  • 尝试安装 pg gem 时找不到 'libpq-fe.h 标头

    我正在使用 Ruby on Rails 3 1 预版本 我喜欢使用 PostgreSQL 但问题是安装pg宝石 它给了我以下错误 gem install pg Building native extensions This could ta
  • Visual Studio 项目为空?

    有没有办法在 Visual Studio 2008 或 2010 中拥有一个空项目 我的意思不是空的解决方案 而是解决方案中的空项目 基本上我有一个包含多个项目的解决方案 并且我想添加一个项目来跟踪一些静态文件 这些静态文件是解决方案的一部
  • 如何获取 Azure SendGrid api 密钥?

    我已按照以下说明进行操作如何使用 SendGrid 和 Azure 发送电子邮件 https learn microsoft com en us azure app service web sendgrid dotnet how to se
  • CXF 2.2.12:如何关闭客户端的架构验证

    我想关闭 JAXB 绑定消息的模式验证 我正在处理客户端 CXF 代码 WSDL 第一代 我尝试过使用
  • 2018 年用 C++ 处理 Unicode 的正确方法是什么?

    我尝试过搜索 stackoverflow 来找到这个问题的答案 但我发现的问题和答案都在10岁由于变化和可能的进展 我似乎无法就该主题达成共识 我知道除了 stl 之外还有几个库应该处理 unicode http userguide icu