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

nas*_*sar 13 c++ string unicode utf-8 character-encoding

我在C++中阅读了一些关于字符串和字符编码的最佳实践的帖子,但是我在寻找一种在我看来相当简单和正确的通用方法时遇到了一些困难.我可以就以下问题征询意见吗?我倾向于使用UTF-8和UTF-32,并定义如下内容:

typedef std::string string8;
typedef std::basic_string<uint32_t> string32;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mat*_* M. 10

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

问题是,大多数框架,甚至标准,都在内存中愚蠢地(我认为)强制编码.我说愚蠢,因为编码应该只对接口有影响,而那些编码不适合数据的内存中操作.

此外,编码很容易(它是一个简单的转换CodePoint - >字节和反向),而主要的困难实际上是操纵数据.

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

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

如果您真的希望操作Unicode字符串,则需要一个支持Unicode的容器.通常的方法是使用ICU库,虽然它的界面真的是C-ish.但是,您将获得使用多种语言实际使用Unicode所需的一切.