C语言编程(基于GNU语法扩展)c&c++c&c++

C11中的通用字符名(Universal Character N

2018-08-27  本文已影响117人  zenny_chen

C11标准中引入了通用字符名Universal Character Names)这个概念。其实,所为的通用字符名也就是我们俗称的Unicode。C11中采用两种方法来表示通用字符名,第一种是 \u 后面加正好四位十六进制数,不能多也不能少。第二种则是 \U 后面加正好八位十六进制数,不能多也不能少。这两者也称为“短标识符”。这里的通用字符名,\uxxxx\Unnnnnnnn,其 xxxxnnnnnnnn 部分所表示的值均为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编码格式的字符进行输出。

上一篇下一篇

猜你喜欢

热点阅读