【问题标题】:Using Unicode (UTF-8) in C++在 C++ 中使用 Unicode (UTF-8)
【发布时间】:2023-03-29 18:30:01
【问题描述】:

目前,我必须在 C++ 11(Linux 环境)中处理 Unicode。 UTF-8 用作默认编码。 我需要的任务:

  • 替换。
  • 正则表达式
  • 遍历 UTF-8 字符串。我不知道使用 std::string 和 "for (character c : s)" 是否会做我想要的,因为每个字符都必须是 unicode 字符。例如ế是一个字符,mão是一个包含3个字符的单词
  • 子字符串。
  • 用 unicode 字符连接子字符串或连接 unicode 字符。
  • 长度。
  • 修剪。
  • 读写文件。

我应该使用什么库来达到最佳效果?

非常感谢。 期待很快收到您的来信。

【问题讨论】:

  • C++ 字符串只处理原始元素(char 代表std::stringwchar_t 代表std::wstringchar16_t 代表std::u16stringchar32_t 代表std::u32string),它们没有字符编码的概念,例如 UTF-8/16/32(尽管 char16_t 用于 UTF-16,char32_t 用于 UTF-32),每个 Unicode 代码点可能使用超过 1 个元素,具体取决于关于它的价值。我会说for (character c : s) 循环不会处理std::stringstd::u16string 的BMP 之外的Unicode 字符。但当wchar_t 为 4 个字节时,它适用于 std::u32stringstd::wstring
  • 就您的要求而言,您确实需要一个良好的 Unicode 感知库。如果你环顾四周,有很多可用的(不要在这里问,寻求建议是题外话)。
  • 非常感谢。我在问之前做了我的研究。我发现的 3 个库是 UTF8CPP、ICU:Unicode、Boost。我不知道哪个是最好的,还有更好的吗?
  • “最佳”是主观的。使用适合您需要的任何一个。如果需要,可以使用多个。
  • “Unicode 字符”是代码点。您所描述的称为用户感知字符或grapheme clusters。在您提到的三个库中,只有 ICU 能够做到这一点;但我不太确定为什么您需要考虑字素簇。你在做什么样的预处理?

标签: linux string c++11 unicode utf-8


【解决方案1】:

对于正则表达式/替换/搜索功能,我以前使用过 PCRE。这是为使用 UTF-8 字符串而设计的。您可能能够使用 STL 正则表达式,但不能以任何可移植的方式。 (尤其是 Windows,不支持 UTF-8 语言环境。)

如果您需要支持组合标记或零宽度连接符,遍历 UTF-8 字符串甚至比您描述的还要复杂!你写道é 是一个字符,但它可能是两个 Unicode 代码点:拉丁文小写字母 e + 结合上面的重音符号。如果您只是想遍历代码点,您可以使用标准库中的mbtowc()std::codecvt::do_in。如果您需要遍历字素,最便携的方法是使用 ICU.

常规字符串连接应该可以工作,标准库的长度为mblen()。这不是完全可移植的,因为多字节编码不一定是 UTF-8(尽管有一组标准的转换函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2011-04-18
    • 1970-01-01
    • 2021-12-12
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多