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

Pet*_*ter 13 c++ unicode

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

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

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

Cha*_*via 38

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

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

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

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

  • 很好,详尽的答案.可能值得添加一些保证Unicode的特定(但流行)平台的信息 - 例如我所知道的所有Windows实现,以及GNU libc,都可以做到这一点.另一方面,FreeBSD不保证,并且有一些宽字符串不是Unicode的语言环境.此外,C99添加了一个预处理程序符号,如果所有字符串函数的所有字符串函数都将Unicode作为Unicode处理,而不管语言环境是什么 - "__ STDC_ISO10646__" - 例如GNU libc定义它.不幸的是,MSVC没有,即使它符合语义. (3认同)