小编典典

C++11 对 Unicode 的支持程度如何?

all

我已经阅读并听说 C++11 支持 Unicode。对此有几个问题:

  • C++ 标准库对 Unicode 的支持程度如何?
  • std::string它应该做的事吗?
  • 我该如何使用它?
  • 潜在问题在哪里?

阅读 67

收藏
2022-07-18

共1个答案

小编典典

C++ 标准库对 unicode 的支持程度如何?

可怕。

快速浏览一下可能提供 Unicode 支持的库设施,我得到了这个列表:

  • 字符串库
  • 本地化库
  • 输入/输出库
  • 正则表达式库

我认为除了第一个之外,所有的都提供了可怕的支持。在快速绕过您的其他问题后,我将更详细地讨论它。

std::string它应该做的事吗?

是的。根据 C++ 标准,这是std::string和它的兄弟应该做的:

类模板basic_string描述的对象可以存储由不同数量的任意类似字符的对象组成的序列,该序列的第一个元素位于零位置。

嗯,std::string这样做就好了。这是否提供任何特定于 Unicode 的功能?不。

应该是?可能不是。std::string作为一个对象序列很好char。这很有用;唯一的烦恼是它是一个非常低级的文本视图,而标准 C++
没有提供更高级别的视图。

我该如何使用它?

将其用作char对象序列;假装它是别的东西注定会以痛苦告终。

潜在问题在哪里?

到处都是?让我们来看看…

字符串库

字符串库为我们提供了basic_string,它只是标准所谓的“类似字符的对象”的序列。我称它们为代码单元。如果您想要一个高级的文本视图,这不是您想要的。这是适合序列化/反序列化/存储的文本视图。

它还提供了 C 库中的一些工具,可用于弥合狭义世界和 Unicode 世界之间的差距:c16rtomb/mbrtoc16c32rtomb/
mbrtoc32

本地化库

本地化库仍然认为这些“类似字符的对象”之一等于一个“字符”。这当然是愚蠢的,并且除了像 ASCII 这样的 Unicode
的一小部分之外,不可能让很多东西正常工作。

例如,考虑一下<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);
// ...
2022-07-18