当前位置: C语言 -- 基础 -- 词法元素

词法元素(三)

三、通用字符名

C语言中通用字符名(universal character names)可用于标识符、字符常量和字符串字面量,用以表示非基本字符集(basic character set)中的字符。ISO/IEC 9899:2024标准第6.4.4 Universal character names节对C语言中通用字符名的语法、语义、使用限制等作了解释。C语言中通用字符名具有以下两种格式:

\uhhhh
\Uhhhhhhhh

其中h为十六进制数字。如果前缀是小写字母u,后接4位十六进制数;如果前缀是大写字母U,后接8位十六进制数。通用字符名\uhhhh表示4位短标识符为hhhh的字符;通用字符名\Uhhhhhhhh表示8位短标识符为hhhhhhhh的字符。4位短标识符hhhh对应的8位短标识符为0000hhhh,所以通用字符名\uhhhh也可以写成\U0000hhhh形式。

使用通用字符名表示ISO/IEC 10646标准中的字符时,字符码点(code point)是通用字符名中十六进制数字序列所表示的十六进制值,例如:通用字符名\u5BB6表示字符的码点是0X5BB6

ISO/IEC 10646标准为每个码点都定义了短标识符,不同码点对应不同短标识符。)


通用字符名不能表示[0XD800,0XDFFF]范围内以及大于0X10FFFF的码点(code point)。通用字符名不能表示的字符包括基本字符集中的字符、ISO/IEC 10646标准为控制字符保留的码位置、DELETE字符、S区(保留供UTF-16使用)、太大不能使用ISO/IEC 10646标准编码的字符。不允许的通用字符转义序列仍然可以使用十六进制和八进制转义序列来表示。

通用字符名如果不在字符常量和字符串字面量内,不得表示控制字符或者基本字符集中的字符。


通用字符名的应用(仅讨论通用字符名表示简体中文汉字的情况。)

① 用作标识符

int \u6536\u5165 = 10000;

② 用作字符常量

wchar_t wc = L'\u7231';
char16_t wch = u'\u7231';

③ 用作字符串字面量

char *ptr = "\u4e2d\u56fd";
wchar_t *wp = L"\u4e2d\u56fd";

通用字符名的输入与输出

通用字符名既可以使用字节函数输入输出,也可以使用宽字符函数输入输出。

范例一

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 

/*使用宽字符函数输出通用字符名*/

#include <locale.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "");
    
    int \u6536\u5165 = 10000;			//用作标识符。
    const wchar_t wc = L'\u7231';		//用作字符常量。
    const wchar_t *wp = L"\u4e2d\u56fd";	//用作字符串字面量。

    wprintf(L"\u6536\u5165: %d\n", \u6536\u5165);
    wprintf(L"%lc\n", wc);
    wprintf(L"%ls\n", wp);

    return 0;
}


范例二

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 

/*使用字节函数输出通用字符名*/

#include <locale.h>
#include <stdio.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "");
    
    int \u6536\u5165 = 10000;		//用作标识符。
    const wchar_t wc = L'\u7231';	//用作字符常量。
    const char *ptr = "\u4e2d\u56fd";	//用作字符串字面量。

    printf("\u6536\u5165: %d\n", \u6536\u5165);
    printf("%lc\n", wc);		
    printf("%s\n", ptr);

    return 0;
}


上述两个程序均输出:

收入: 10000

中国