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