如何使用Clang在C ++ 17中指定utf-16字符串文字的字节序?

时间:2018-11-15 02:20:10

标签: c++ unicode clang standards c++17

在现代C ++源代码中允许

UTF-16字符串文字,例如auto str = u"中国字";

UTF-16具有两个字节序:UTF-16LE和UTF-16BE。 C ++标准未指定UTF-16字符串文字的字节序。因此,我认为这是实现定义的。

在编译时是否可以指定字节序?

1 个答案:

答案 0 :(得分:2)

u为前缀的字符串文字是const char16_t值的数组:

C ++ 17 [lex.string] / 10:

  

u开头的字符串文字,例如u"asdf",是char16_t字符串文字。 char16_t字符串文字的类型为“ n const char16_t的数组”,其中n是如下定义的字符串的大小;会使用给定的字符进行初始化。

所以引号中的文字等效于Unicode系统上的

const char16_t x[] = { 97, 115, 100, 102, 0 };

换句话说,字符串文字的表示形式与该数组的表示形式相同。

对于更复杂的字符串,它仍然是const char16_t的数组;并且每个 c-char 可能有多个代码点,即数组中的元素数量可能大于字符串中似乎出现的字符数量。


要回答标题中的问题:我不知道任何编译器选项(对于任何编译器)都可以让您配置char16_t的字节序。我希望任何目标系统对所有整数类型都使用相同的字节序。 char16_t应该具有与uint_least16_t([basic.fundamental] / 5)相同的属性。

如果您的代码包含字符串文字,并且您想将其写为文件,例如UTF16-BE,则您需要进行常规的字节序检查/调整,以防系统将char16_t很少地存储在<li>中字节序形式。