代码改变世界

UTF8转unicode说明

2017-03-13 17:15  fdd566  阅读(560)  评论(0编辑  收藏  举报

1、最新版iconv中的char *encTo = "UNICODE//IGNORE"; 是没有这个字符串的,它里面有UNICODELITTLE 和 UNICODEBIG 而且是没有开头表征大小端的两字节的。

2、转换代码如下:

 1 bool utf8_to_unicode(char *inbuf, size_t *inlen, char *outbuf, size_t *outlen)
 2 {
 3 
 4   /* 目的编码, TRANSLIT:遇到无法转换的字符就找相近字符替换
 5    *           IGNORE :遇到无法转换字符跳过*/
 6   char *encTo = "UNICODELITTLE";
 7   //char *encTo = "gb2312";
 8   //char *encTo = "UNICODE";
 9   /* 源编码 */
10   char *encFrom = "UTF-8";
11   //char *encFrom = "utf-8";
12 
13   /* 获得转换句柄
14    *@param encTo 目标编码方式
15    *@param encFrom 源编码方式
16    *
17    * */
18   iconv_t cd = iconv_open (encTo, encFrom);
19   if (cd == (iconv_t)-1)
20   {
21       perror ("iconv_open");
22   }
23 
24   /* 需要转换的字符串 */
25   //DBG_PRINT("inbuf=%s\n", inbuf);
26 
27   /* 打印需要转换的字符串的长度 */
28   //DBG_PRINT("inlen=%d\n", *inlen);
29 
30   /* 由于iconv()函数会修改指针,所以要保存源指针 */
31   char *tmpin = inbuf;
32   char *tmpout = outbuf;
33   //size_t insize = *inlen;
34   size_t outsize = *outlen;
35 
36   /* 进行转换
37    *@param cd iconv_open()产生的句柄
38    *@param srcstart 需要转换的字符串
39    *@param inlen 存放还有多少字符没有转换
40    *@param tempoutbuf 存放转换后的字符串
41    *@param outlen 存放转换后,tempoutbuf剩余的空间
42    *
43    * */
44   size_t ret = iconv(cd, &tmpin, inlen, &tmpout, outlen);
45   if (ret == -1)
46   {
47      perror ("iconv");
48   }
49 
50   /* 存放转换后的字符串 */
51   //DBG_PRINT("outbuf=%s\n", outbuf);
52 
53   //存放转换后outbuf剩余的空间
54   //DBG_PRINT("outlen=%d\n", *outlen);
55 
56   int i = 0;
57 
58   for (i=0; i<(outsize- (*outlen)); i++)
59   {
60      ////DBG_PRINT("%2c", outbuf[i]);
61      //DBG_PRINT("%x\n", outbuf[i]);
62   }
63 
64   /* 关闭句柄 */
65   iconv_close (cd);
66 
67   return 0;
68 }