是一个宽字符串文字,以L开头,如L“Hello World”,保证用Unicode编码吗?

时间:2009-11-27 19:34:03

标签: c++ unicode

我最近试图全面了解创建支持unicode的独立于平台的C ++应用程序所需的步骤。令我感到困惑的是,大多数的howtos和东西均衡了字符编码(即ANSI或Unicode)和字符类型(char或wchar_t)。正如我到目前为止所了解的那样,这些是不同的东西,可能存在一个用Unicode编码的字符序列,但用std :: string表示,以及用ANSI编码的字符序列,但表示为std :: wstring,对吗?

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

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

3 个答案:

答案 0 :(得分:35)

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

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

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

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

答案 1 :(得分:2)

该标准未提及字符串的编码格式。

查看IBM的ICU(免费)。 http://site.icu-project.org/

答案 2 :(得分:2)

C ++ 03没有提到unicode(未来的C ++ 0x)。目前,您必须使用外部库(ICUUTF-CPP等)或使用特定于平台的代码构建您自己的解决方案。正如其他人所提到的,未指定wchar_t编码(或甚至大小)。因此,字符串文字编码是特定于实现的。但是,您可以使用\ x \ u \ U转义文件在字符串文字中提供unicode代码点。

Windows中的unicode应用程序通常使用wchar_t(使用UTF-16编码)作为内部字符格式,因为它使Windows API本身使用UTF-16更容易使用Windows API。 Unix / Linux unicode应用程序通常在内部使用char(使用UTF-8编码)。如果您想在不同平台之间交换数据,UTF-8通常是数据传输编码的选择。