C11及后续版本中L'\x1234'等字符常量的区别与相关疑问
C11及后续版本中四种字符常量的区别与疑问解答
四个字符常量的核心区别
L'\x1234':- 类型:
wchar_t - 含义:从**执行字符集(ECS)**中取出编码为
0x1234的字符,再转换为宽执行字符集对应的编码值,作为wchar_t类型常量。
- 类型:
'\u1234':- 类型:
char(若U+1234的编码在char取值范围)或int(超出范围时) - 含义:直接表示Unicode代码点
U+1234对应的字符,需能被当前ECS容纳,否则会触发未定义行为。
- 类型:
u'\x1234':- 类型:
char16_t - 含义:从ECS中取出编码为
0x1234的字符,转换为对应的Unicode代码点后,再编码为UTF-16格式,作为char16_t类型常量。
- 类型:
L'\u1234':- 类型:
wchar_t - 含义:直接表示Unicode代码点
U+1234对应的字符,转换为宽执行字符集的编码值,作为wchar_t类型常量。
- 类型:
疑问解答
1. 无L前缀的'\u1234'类型是什么?
在C11及后续版本中,无前缀的'\u1234'属于普通字符常量,其类型由Unicode代码点U+1234在当前ECS中的编码值决定:
- 如果该编码值落在
char类型的取值范围内,常量类型为char; - 如果编码值超出
char的范围,常量类型自动升级为int。
2. L'\u1234'的整数值是什么?是否为UTF-16编码0x1234的字符在ECS中的编码?
L'\u1234'的整数值是Unicode代码点U+1234在宽执行字符集中的编码值,和UTF-16编码0x1234在ECS中的编码无关。
前缀L对应wchar_t类型,编译器会直接将U+1234这个Unicode代码点转换为宽执行字符集(通常是UTF-32,或平台特定的宽编码)的对应值,作为最终的常量值。
3. u'\x1234'所表示的字符的UTF-16编码是0x1234还是取决于ECS?
u'\x1234'的UTF-16编码取决于ECS,并非固定为0x1234:
- 首先,
\x1234会从ECS中取出编码为0x1234的字符; - 然后编译器会将该字符映射到对应的Unicode代码点;
- 最后再将这个Unicode代码点编码为UTF-16格式,得到
char16_t类型的常量值。
只有当ECS中0x1234对应的字符恰好是Unicode代码点U+1234时,其UTF-16编码才会是0x1234。
内容的提问来源于stack exchange,提问作者apadana
相关产品推荐
相关产品推荐

