我根据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与英特尔编译器一起使用。
答案 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_t
到char16_t
的转换并使用u16string
s,但这不会带来太多好处。
pugixml中的保存和加载函数采用xml_encoding
参数,该参数允许您选择程序外部数据的编码,并且不必与内部使用的内容相匹配。选择最方便的选择。