UTF-8/UNICODE/简体中文/繁体中文之间的转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UTF-8/UNICODE/简体中文/繁体中文之间的转换相关的知识,希望对你有一定的参考价值。
简介
这几天一直在研究中文的简体和繁体之间的转换问题,网上查了一下资料,在此进行整理和备份。
繁体中文有GBK码和BIG5码两种编码,简体中文一般使用的是GB2312编码。
这些编码之间的转换基本都是使用下列3个函数:LCMapString、WideCharToMultiByte和MultiByteToWideChar,其中还会牵涉到UNICODE码和UTF-8码这两种编码。
GB2312编码与GBK编码可以直接使用LCMapString转换,GB2312编码/GBK编码与BIG5编码则无法直接转换,必须使用UNICODE作为中间编码进行中转。
另外UTF-8编码是网络常用编码,如XML文件和网页基本都是使用这种编码,所以在此也一并研究了一下。
下面是我将GB2312/GBK/BIG5/UNICODE/UTF-8这5种编码之间的转换编写到一个函数的代码。
代码
1 int Convert(void *sstr, int scp, void **dstr, int dcp)
2 {
3 #define CP_GBK 936
4 #define CP_BIG5 950
5 #define CP_UTF8 65001
6
7 enum { _unicode, _utf8, _gb2312, _gbk, _big5 };
8 enum { _wc2mb, _mb2wc, _sc2tc, _tc2sc };
9
10 LCID lcid;
11 void *src;
12 void *dest;
13 int cch;
14 int scp0;
15 int act;
16 UINT cp;
17
18 if (((scp < _unicode) || (scp > _big5)) ||
19 ((dcp < _unicode) || (dcp > _big5)))
20 return -1;
21
22 src = NULL;
23 dest = sstr;
24 cch = 0;
25 scp0 = scp;
26
27 while (scp != dcp)
28 {
29 src = dest;
30 switch (scp)
31 {
32 case _unicode:
33 switch (dcp)
34 {
35 case _utf8:
36 scp = _utf8;
37 act = _wc2mb;
38 cp = CP_UTF8;
39 break;
40 case _gb2312:
41 scp = ((scp0 == _big5) ? _gbk : _gb2312);
42 act = _wc2mb;
43 cp = CP_GBK;
44 break;
45 case _gbk:
46 scp = _gbk;
47 act = _wc2mb;
48 cp = CP_GBK;
49 break;
50 case _big5:
51 scp = _big5;
52 act = _wc2mb;
53 cp = CP_BIG5;
54 break;
55 }
56 break;
57 case _utf8:
58 switch (dcp)
59 {
60 case _unicode:
61 case _gb2312:
62 case _gbk:
63 case _big5:
64 scp = _unicode;
65 act = _mb2wc;
66 cp = CP_UTF8;
67 break;
68 }
69 break;
70 case _gb2312:
71 switch (dcp)
72 {
73 case _unicode:
74 case _utf8:
75 scp = _unicode;
76 act = _mb2wc;
77 cp = CP_GBK;
78 break;
79 case _gbk:
80 case _big5:
81 scp = _gbk;
82 act = _sc2tc;
83 break;
84 }
85 break;
86 case _gbk:
87 switch (dcp)
88 {
89 case _unicode:
90 case _utf8:
91 case _big5:
92 scp = _unicode;
93 act = _mb2wc;
94 cp = CP_GBK;
95 break;
96 case _gb2312:
97 scp = _gb2312;
98 act = _tc2sc;
99 break;
100 }