c++ - C++中的字符串和字符编码

标签 c++ string unicode utf-8 character-encoding

我阅读了几篇关于 C++ 中字符串和字符编码的最佳实践的文章,但我在寻找一种在我看来相当简单和正确的通用方法方面有些困难。我可以就以下内容征求意见吗?我倾向于使用 UTF-8 和 UTF-32,并定义如下:

typedef std::string string8;
typedef std::basic_string<uint32_t> string32;

string8 类将用于 UTF-8,具有单独的类型只是对编码的提醒。另一种方法是让 string8 成为 std::string 的子类,并删除不太适合 UTF-8 的方法。

当需要固定字符大小时,string32 类将用于 UTF-32。

UTF-8 CPP 函数,utf8::utf8to32() 和 utf8::utf32to8(),甚至更简单的包装函数,将用于在两者之间进行转换。

最佳答案

如果你打算只传递字符串而不检查它们,你可以使用普通的 std::string 虽然这是一个穷人的工作。

问题在于,大多数框架,甚至是标准框架,都愚蠢地(我认为)在内存中强制执行编码。我说愚蠢是因为编码只在接口(interface)上很重要,而那些编码不适用于内存中的数据操作。

此外,编码很容易(它是一个简单的转置 CodePoint -> 字节,反之亦然),而主要的困难实际上是关于操纵数据。

对于 8 位或 16 位,您可能会在中间切掉一个字符,因为 std::stringstd::wstring 都不知道Unicode 字符是什么。更糟糕的是,即使使用 32 位编码,也存在将字符与适用于它的变音符号分开的风险,这也是愚蠢的。

因此,就标准而言,C++ 中对 Unicode 的支持非常低。

如果你真的想操作 Unicode 字符串,你需要一个支持 Unicode 的容器。通常的方法是使用 ICU 库,尽管它的界面是真正的 C-ish。但是,您将获得在 Unicode 中使用多种语言实际工作所需的一切。

关于c++ - C++中的字符串和字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3950588/

相关文章:

javascript - 如何提高 UTF32 到 UTF16 代理对转换器的性能

java - 哪个系统组件负责在 Java 应用程序中绑定(bind) Unicode 连字?

c++ - 如何将 cin 用于数组

C++ 为简单链表编写复制构造函数

c++ - 二进制数据 JSONCPP

string - 在字符串中搜索一组分隔符中的第一个分隔符的有效方法是什么?

sqlite - SQLite用日语文本导入CSV

c++ - Visual C++ Win32 控制台应用程序 printf 在 while 循环中多行输出

c++ - 为什么在通过添加字符串文字和 char 进行初始化时不打印字符串

c - 使用变量将不同的字符串分配给 char 数组