字符编码转换_进制转换(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小时内删除。