用什么来存储Unicode(UTF-16)字符串? (C ++ 11)

时间:2014-05-13 13:40:54

标签: c++ c++11 unicode

我根据C ++ 11带来的创新,即uchar16_t / u16string,提出这个问题。

我编写了一个应该具有多语言支持的应用程序。根据我的计划,本地化字符串将以XML格式存储为UTF-16,并使用pugixml进行检索。这些字符串既可用于GUI,也可用于生成计算结果的HTML报告。由于我已经将wchar_t / wstring理解为不赞成使用新的u16string,因此我计划使用u16string在程序中存储语言字符串。 但是既然pugixml和MFC的CString都使用wchar_t作为Unicode的下划线存储类型,那么我现在可能会忘记u16string而是直接使用wstring吗?

语言可移植性至关重要,平台可移植性并不重要。

我将MVS 2013与英特尔编译器一起使用。

1 个答案:

答案 0 :(得分:9)

用于在程序之外存储数据的编码是唯一重要的。

该数据可能会从其他软件中使用。有人会想要写这些字符串,他们可能会使用某种专门的编辑器或 gasp 一个通用的文本编辑器。 UTF-8得到了比UTF-16更好的其他软件支持,这就是我的建议和原因。

在程序中,你使用的编码无关紧要,只要你一直这样做并且不要以愚蠢的方式混淆它们。

显然,如果你在程序中使用与在其外部相同的编码,则不需要执行任何转换,并且不存在将它们混合并生成mojibake的风险。

使用wchar_t的pugixml是因为它使用的编码取决于wchar_t的大小。如果大小为2,则使用UTF-16;如果大小为4则使用UTF-32。通过适当设置PUGIXML_WCHAR_MODE宏,pugixml还可以选择将UTF-8与char一起使用,这样您就可以使用它。

如果您使用wchar_t API,请坚持wstring。请记住:因为我们在程序中,所以只要我们是一致的,它将是UTF-16还是UTF-32并不重要。如果您使用char API,请坚持string。我猜,您可以执行从wchar_tchar16_t的转换并使用u16string s,但这不会带来太多好处。

pugixml中的保存和加载函数采用xml_encoding参数,该参数允许您选择程序外部数据的编码,并且不必与内部使用的内容相匹配。选择最方便的选择。