Rya*_* Li 2 c endianness c11 char16-t char32-t
在C11,对于便携式宽字符类型的支持char16_t和char32_t被加入分别为UTF-16和UTF-32.
但是,在技术报告中,没有提到这两种类型的字节顺序.
例如,使用以下代码gcc-4.8.4编译时,我的x86_64计算机上的以下代码段-std=c11:
#include <stdio.h>
#include <uchar.h>
char16_t utf16_str[] = u"??"; // U+5341 U+516D
unsigned char *chars = (unsigned char *) utf16_str;
printf("Bytes: %X %X %X %X\n", chars[0], chars[1], chars[2], chars[3]);
Run Code Online (Sandbox Code Playgroud)
会产生
Bytes: 41 53 6D 51
Run Code Online (Sandbox Code Playgroud)
这意味着它是小端的.
但这种行为平台/实现是否依赖:它是否始终遵循平台的字节序,或者某些实现是否可以选择始终实现char16_t并char32_t使用big-endian?
char16_t并且char32_t不保证Unicode编码.(这是一个C++特性.)宏__STDC_UTF_16__和__STDC_UTF_32__分别表示Unicode代码点实际上确定了固定大小的字符值.有关这些宏,请参见C11§6.10.8.2.
(顺便说一下,它__STDC_ISO_10646__表示同样的事情wchar_t,它也揭示了通过哪个Unicode版本实现wchar_t.当然,在实践中,编译器只是将源文件中的代码点复制到目标文件中的字符串,所以它不会需要了解特定角色.)
鉴于Unicode编码生效时,代码点值存储在char16_t或char32_t必须具有相同的对象表示为uint_least16_t和uint_least32_t的,因为它们被定义为typedef别名那些类型,分别为(C11§7.28).这与C++形成鲜明对比,C++使这些类型不同但明确要求兼容的对象表示.
其结果是,是的,有什么特别的char16_t和char32_t.它们是平台字节序中的普通整数.
但是,您的测试程序与字节序无关.它只是使用宽字符的值而不检查它们如何映射到内存中的字节.