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 ", inbuf); 26 27 /* 打印需要转换的字符串的长度 */ 28 //DBG_PRINT("inlen=%d ", *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 ", outbuf); 52 53 //存放转换后outbuf剩余的空间 54 //DBG_PRINT("outlen=%d ", *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 ", outbuf[i]); 62 } 63 64 /* 关闭句柄 */ 65 iconv_close (cd); 66 67 return 0; 68 }