forked from haipome/utf8
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutf8.h
108 lines (90 loc) · 2.83 KB
/
utf8.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
* Description: UTF-8 字符串的解码和编码函数
* unicode 字符处理函数
* History: [email protected], 2013/05/29, create
*
* This code is in the public domain.
* You may use this code any way you wish, private, educational,
* or commercial. It's free.
*/
# pragma once
# include <stdint.h>
# include <stddef.h>
/*
* 标准 C 并没有规定 wchar_t 的位数。但 GNU C Lib 保证 wchar_t 是 32 位的,
* 所以可以用 wchar.h 中定义的函数来像 wchar_t 一样操纵 ucs4_t.
* http://www.gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html
*/
typedef int32_t ucs4_t;
/*
* 从 UTF-8 编码的字符串 *src 中读取一个 unicode 字符,并更新 *src 的值。
*
* 如果遇到非法 UTF-8 编码,则跳过非法部分。
* 如果 illegal 参数不为 NULL, 则 *illegal 表示非法 UTF-8 编码字节数。
*/
ucs4_t getu8c(char **src, int *illegal);
/*
* 将 src 指向的 UTF-8 编码字符串解码为 unicode,放在长度为 n 的数组 des 中,
* 并在末尾添加 0. 如果 des 不足以存放所有的字符,则最多保存 n - 1 个 unicode
* 字符并补 0.
*
* 如果遇到非法 UTF-8 编码,则跳过非法部分。
* 如果 illegal 不为 NULL, 则 *illegal 表示非法 UTF-8 编码的字节数。
*/
size_t u8decode(char const *str, ucs4_t *des, size_t n, int *illegal);
/*
* 将 unicode 字符 uc 编码为 UTF-8 编码,放到长度为 *left 的字符串 *des 中。
*
* 如果 *des 不足以存放 uc 对应的 UTF-8 字符串,返回一个负值。
* 如果成功,更新 *des 和 *left 的值。
*/
int putu8c(ucs4_t uc, char **des, size_t *left);
/*
* 将以 0 结尾的 unicode 数组 us 编码为 UTF-8 字符串,放到长度为 n 的字符串 des 中。
*
* 负数为非法的 unicode 字符。
* 如果 illegal 不为 NULL,则 *illegal 表示非法的 unicode 字符数。
*/
size_t u8encode(ucs4_t *us, char *des, size_t n, int *illegal);
/*
* 判断是否为全角字符
*/
int isufullwidth(ucs4_t uc);
/*
* 判断是否为全角字母
*/
int isufullwidthalpha(ucs4_t uc);
/*
* 判断是否为全角数字
*/
int isufullwidthdigit(ucs4_t uc);
/*
* 全角字符转半角字符。
* 如果 uc 为全角字符,则返回对应的半角字符,否则返回 uc 本身。
*/
ucs4_t ufull2half(ucs4_t uc);
/*
* 半角字符转全角字符
* 如果 uc 为半角字符,则返回对应的全角字符,否则返回 uc 本身。
*/
ucs4_t uhalf2full(ucs4_t uc);
/*
* 判断是否为汉字字符(中日韩越统一表意文字)
*/
int isuchiness(ucs4_t uc);
/*
* 判断是否为中文标点
*/
int isuzhpunct(ucs4_t uc);
/*
* 判断是否为日文平假名字符
*/
int isuhiragana(ucs4_t uc);
/*
* 判断是否为日文片假名字符
*/
int isukatakana(ucs4_t uc);
/*
* 判断是否为韩文字符
*/
int isukorean(ucs4_t uc);