我已经阅读并听说 C++11 支持 Unicode。对此有几个问题:
std::string
C++ 标准库对 unicode 的支持程度如何?
可怕。
快速浏览一下可能提供 Unicode 支持的库设施,我得到了这个列表:
我认为除了第一个之外,所有的都提供了可怕的支持。在快速绕过您的其他问题后,我将更详细地讨论它。
做std::string它应该做的事吗?
是的。根据 C++ 标准,这是std::string和它的兄弟应该做的:
类模板basic_string描述的对象可以存储由不同数量的任意类似字符的对象组成的序列,该序列的第一个元素位于零位置。
basic_string
嗯,std::string这样做就好了。这是否提供任何特定于 Unicode 的功能?不。
应该是?可能不是。std::string作为一个对象序列很好char。这很有用;唯一的烦恼是它是一个非常低级的文本视图,而标准 C++ 没有提供更高级别的视图。
char
我该如何使用它?
将其用作char对象序列;假装它是别的东西注定会以痛苦告终。
潜在问题在哪里?
到处都是?让我们来看看…
字符串库
字符串库为我们提供了basic_string,它只是标准所谓的“类似字符的对象”的序列。我称它们为代码单元。如果您想要一个高级的文本视图,这不是您想要的。这是适合序列化/反序列化/存储的文本视图。
它还提供了 C 库中的一些工具,可用于弥合狭义世界和 Unicode 世界之间的差距:c16rtomb/mbrtoc16和c32rtomb/ mbrtoc32。
c16rtomb
mbrtoc16
c32rtomb
mbrtoc32
本地化库
本地化库仍然认为这些“类似字符的对象”之一等于一个“字符”。这当然是愚蠢的,并且除了像 ASCII 这样的 Unicode 的一小部分之外,不可能让很多东西正常工作。
例如,考虑一下<locale>标头中标准所称的“便利接口”:
<locale>
template <class charT> bool isspace (charT c, const locale& loc); template <class charT> bool isprint (charT c, const locale& loc); template <class charT> bool iscntrl (charT c, const locale& loc); // ... template <class charT> charT toupper(charT c, const locale& loc); template <class charT> charT tolower(charT c, const locale& loc); // ...