当前位置: C语言 -- 专题 -- 通用字符名

通用字符名

C语言中通用字符名(universal character names)可用于标识符、字符常量和字符串字面量,用以表示非基本字符集(basic character set)中的字符。ISO/IEC 9899:2018标准第6.4.3 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标准为每个码点都定义了短标识符,不同码点对应不同短标识符。


通用字符名不能表示短标识符小于00A00024$)、0040@)和0060`)除外)的字符,也不能表示D800DFFF范围内的字符。不能表示的字符是基本字符集中的字符和ISO/IEC 10646标准为控制字符、DELETE字符和S区域(保留供UTF-16使用)保留的代码位置。


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

1、用作标识符

通用字符名用作标识符时和普通字符一样,例如:

int \u6536\u5165 = 10000;

2、用作字符常量

通用字符名用作字符常量时应将其声明为宽字符类型,不能声明为多字节字符类型,例如:

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

3、用作字符串字面量

通用字符名用作字符串字面量时既可以声明为宽字符类型,也可以声明为多字节字符类型,例如:

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

:根据ISO/IEC 9899:2018标准第6.4.4.4 Character constants节和6.4.5 String literals节,u8前缀可以用于字符串字面量,表示UTF-8字符串字面量;但不可以用于字符常量。


通用字符名的输入与输出

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

范例一

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

中国

注:分别使用Visual Studioideone编译。