字符编码转换_进制转换(GB2312,GBK,JNI,HexTOStr)[cpp]
1. //
2. /*
3. ASCII 英⽂⼀个字节
4. gb2312,gbk 中⽂两个字节,英⽂⼀个字节
5. 在中⽂系统中ansi⼀般指gb2312或gbk
6. GB2312、GBK都属于双字节字符集 (DBCS)
7. Utf-8 中⽂三个字节,英⽂⼀个字节
8. Unicode 中⽂两个字节,英⽂两个字
9. */
10. //
11. //
12. /*
13. GB2312 中国国家 标准码
14.
15. ANSI码(American National Standards Institute)
16. 美国国家 标准学会 的 标准码
17.
18. ASCII码(America Standard Code for Information Interchange)美国信息交换标准码
19.
20. 你可以认为是不同的东西!
21. ANSI码仅在前126个与ASCII码相同
22. */
23. //
24.
25. //
26. /*
27. /*
28. * ⼆进制、⼋进制、⼗进制、⼗六进制转换 16进制和字符相互转
换
29. */
30. //
31.
32. //
33. /*
34. java内部是使⽤16bit的unicode编码(UTF-16)来表⽰字符串的,⽆论中⽂英⽂都是2字节;
35. jni内部是使⽤UTF-8编码来表⽰字符串的,UTF-8是变长编码的unicode,⼀般ascii字符是1字节,中⽂是3字节;
36. c/c++使⽤的是原始数据,ascii就是⼀个字节了,中⽂⼀般是GB2312编码,⽤两个字节来表⽰⼀个汉字。
37. */
38. //
39.
40. //
41. // CodeConver.h
42. //
43.
44. #ifndef CodeConver_H
45. #define CodeConver_H
46.
47. namespace CodeConvert
48. {
49.
二进制编码转换50. #include <stdio.h>
51. #include <string.h>
52. #include <windows.h>
53. #include <assert.h>
54. #include <jni.h>
55. #include <jni_md.h>
56.
57. // ANSI To Unicode
58. // 测试通过
59. wchar_t * ANSIToUnicode( const char* str )
60. {
61. int textlen ;
62. wchar_t * result;
63.
64. textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 );
65. if (textlen ==0)
66. {
67. return NULL;
68. }
69. result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
70. memset(result,0,(textlen+1)*sizeof(wchar_t));
71. MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );
72. return result;
73. }
74.
75. /************************************************************************/
76. // Unicode To ANSI(美国国家标准码)
77. // 测试通过
78. // [2/8/2012 liu]
79. /************************************************************************/
80. char * UnicodeToANSI( const wchar_t* str )
81. {
82. char* result;
83. int textlen;
84. textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
85. if (textlen ==0)
86. {
87. return NULL;
88. }
89. result =(char *)malloc((textlen+1)*sizeof(char));
90. memset( result, 0, sizeof(char) * ( textlen + 1 ) );
91. WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );
92. return result;
93. }
94.
95. /************************************************************************/
96. // UTF8 To Unicode
97. // [2/8/2012 liu]
98. // 测试通过
99. /************************************************************************/
100. int UTF8ToUnicode( wchar_t * &result,const char* utf8 )
101. {
102. int textlen ;
103. textlen = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)utf8,-1, NULL,0 );
104. if (textlen == 0)
105. {
106. return NULL;
107. }
108. result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
109. memset(result,0,textlen * 2 + 2);
110. int widelen = MultiByteToWideChar(CP_UTF8, 0,(LPCSTR)utf8,-1,(LPWSTR)result,textlen ); 111. return widelen-1;
112.
113. }
114.
115. /************************************************************************/
116. // UnicodeToUTF8
117. //
118. // [2/8/2012 liu]
119. /************************************************************************/
120. char * UnicodeToUTF8( const wchar_t* str )
121. {
122. char* result;
123. int textlen;
124. textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );
125. if (textlen == 0)
126. {
127. return NULL;
127. return NULL;
128. }
129. result =(char *)malloc((textlen+1)*sizeof(char));
130. memset(result, 0, sizeof(char) * ( textlen + 1 ) );
131. WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL ); 132. return result;
133. }
134. /************************************************************************/
135. // 宽字符 转换为 多字符 Unicode - ANSI
136. //
137. // [2/8/2012 liu]
138. /************************************************************************/
139. char* w2m(const wchar_t* wcs)
140. {
141. int len;
142. char* buf;
143. if (wcs =NULL)
144. {
145. return NULL;
146. }
147. len =wcstombs(NULL,wcs,0);
148. if (len == 0)
149. return NULL;
150. buf = (char *)malloc(sizeof(char)*(len+1));
151. memset(buf, 0, sizeof(char) *(len+1));
152. len =wcstombs(buf,wcs,len+1);
153. return buf;
154. }
155.
156. /************************************************************************/
157. // 多字符 转换为 宽字符 ANSI - Unicode
158. //
159. // [2/8/2012 liu]
160. /************************************************************************/
161. wchar_t* multiByte_to_wideChar(const char* mbs)
162. {
163. int len;
164. wchar_t* buf;
165. if (mbs == NULL)
166. {
167. return NULL;
168. }
169. len =mbstowcs(NULL,mbs,0);
170. if (len == 0)
171. return NULL;
172. buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1));
173. memset(buf, 0, sizeof(wchar_t) *(len+1));
174. len =mbstowcs(buf,mbs,len+1);
175. return buf;
176. }
177.
178. /************************************************************************/
179. // ANSI To UTF8
180. //
181. // [2/8/2012 liu]
182. /************************************************************************/
183. char* ANSIToUTF8(const char* str)
184. {
185. return UnicodeToUTF8(ANSIToUnicode(str));
186. }
187.
188. /************************************************************************/
189. // UTF8 To ANSI
190. // 测试通过
191. // [2/8/2012 liu]
192. /************************************************************************/
193. char* UTF8ToANSI(const char* str)
194. {
195. wchar_t * temp;
196. if (str == NULL)
197. {
198. return NULL;
199. }
200. UTF8ToUnicode(temp,str);
201. return UnicodeToANSI(temp);
202. }
203.
204.
205.
206. // 测试OK
207. // UTF8 convert to GB2312
208. void UTF8ToGB2312( const char * utf8, char * &gb2312 )
209. {
210. int nLen = MultiByteToWideChar( CP_UTF8, 0, utf8, -1, NULL, 0 ); 211. if (nLen == 0)
212. {
213. gb2312 = NULL;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论