C11中的通用字符名(Universal Character Names)

C11标准中引入了通用字符名(Universal Character Names)这个概念。其实,所为的通用字符名也就是我们俗称的Unicode。C11中采用两种方法来表示通用字符名,第一种是 \u 后面加正好四位十六进制数,不能多也不能少。第二种则是 \U 后面加正好八位十六进制数,不能多也不能少。这两者也称为“短标识符”。这里的通用字符名,\uxxxx 或 \Unnnnnnnn,其 xxxx 或 nnnnnnnn 部分所表示的值均为Unicode码点值(Unicode code point)。

C11中对通用字符名的取值范围做了约束:它所指定的码点值除了0024($)、0040(@)、0060(‘)之外,不应该小于00A0;同时,该值也不能在D800到DFFF范围内,因为该范围属于UTF-16编码的高位代理码点。

C11中的通用字符名神奇的一点是,它不仅能用于一般的字符常量以及字符串字面量,而且还能用于指定标识符。下面我们来举一个综合性的例子:

    int \u4f60\u597d = 100;     // 这里的标识符相当于:你好
    int \U0000597d = 50;        // 这里的标识符相当于:好
    
    // 这里的标识符相当于😊😁
    int \U0001f60a\U0001f601 = \U00004f60\u597d + \U0000597d;
    
    // 输出:你好😊😁 value is: 150
    printf("\u4f60\u597d\U0001f60a\U0001f601 value is: %d\n", \U0001f60a\U0001f601);

我们可以看到,当通用字符名用于字符串字面量中时,它会根据当前源文件的编码格式自动转换为相应的编码格式。像笔者这里用的Xcode,文件编码格式为UTF-8,因此这里 printf 中的字符串字面量中的Unicode码点值都会被转换为UTF-8编码格式的字符进行输出。

作者:zenny_chen
链接:https://www.jianshu.com/p/0edabe77a5a1

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值