我最近尝试全面了解创建支持Unicode的独立于平台的C++应用程序需要采取的步骤。让我感到困惑的是,大多数howto和东西都使字符编码(即ANSI或Unicode)和字符类型(char或wchar_t)相等。到目前为止,我了解到的是不同的东西,可能存在以Unicode编码但以std::string表示的字符序列以及以ANSI编码但以std::wstring表示的字符序列,对吗?

因此,我想到的问题是C++标准是否对以L开头的字符串文字的编码提供任何保证,还是只是说它是具有实现特定字符编码的wchar_t类型?

如果没有这样的保证,是否表示我需要某种外部资源系统,以便以独立于平台的方式为我的应用程序提供非ASCII字符串文字?
首选的方式是什么?资源系统或源文件的正确编码以及正确的编译器选项?

最佳答案

字符串文字前面的L符号只是意味着字符串中的每个字符都将作为wchar_t存储。但这并不一定意味着Unicode。例如,您可以使用宽字符串对GB 18030进行编码,Unicode char types and string literals是在中国使用的类似于Unicode的字符集。 C++ 03标准没有关于Unicode的任何内容(但是C++ 11定义了ojit_a),因此您可以自行决定在C++ 03中正确表示Unicode字符串。

关于字符串文字,C++标准的第2章(词汇约定)提到了“基本源字符集”,它基本上等效于ASCII。因此,这基本上保证了"abc"将被表示为3个字节的字符串(不计算空值),并且L"abc"将被表示为3 * sizeof(wchar_t)的宽字符字节字符串。

该标准还提到了“通用字符名称”,该名称允许您使用\uXXXX十六进制表示法引用非ASCII字符。这些“通用字符名称”通常直接映射到Unicode值,但标准不保证必须这样做。但是,您至少可以通过使用通用字符名称来保证您的字符串将以一定的字节序列表示。如果运行时环境支持Unicode,已安装适当的字体等,这将保证Unicode输出。

至于C++ 03源文件中的字符串文字,同样不能保证。如果代码中的Unicode字符串文字包含ASCII范围以外的字符,则由编译器决定如何解释这些字符。如果要明确保证编译器将“做正确的事”,则需要在字符串文字中使用\uXXXX表示法。

10-05 18:04
查看更多