免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: gejiajie_01
打印 上一主题 下一主题

一个关于iconv函数utf16转utf8码的问题 [复制链接]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
11 [报告]
发表于 2009-01-12 15:27 |只看该作者

回复 #9 gejiajie_01 的帖子

utf-8的汉字应该有三个字节
6d4b不是utf-8编码

论坛徽章:
0
12 [报告]
发表于 2009-02-06 23:26 |只看该作者
你没有看明白iconv的使用说明。 iconv的函数本身, 所有的参数是输入也是输出。转换完成之后, oput指向没有使用缓冲区的开始,而不是转换结果。
所以是应该 printf("%s", out_buf); 而不是printf("%s", oput);

[ 本帖最后由 pagx 于 2009-2-6 23:32 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
13 [报告]
发表于 2009-02-08 00:00 |只看该作者
原帖由 pagx 于 2009-2-6 23:26 发表
你没有看明白iconv的使用说明。 iconv的函数本身, 所有的参数是输入也是输出。转换完成之后, oput指向没有使用缓冲区的开始,而不是转换结果
所以是应该 printf("%s", out_buf); 而不是printf("%s", oput);

没看懂

论坛徽章:
0
14 [报告]
发表于 2009-02-09 18:36 |只看该作者
ddd

  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <iconv.h>

  4. int jsstring_conv(char *ibuf, char *obuf, size_t olen)
  5. {
  6.     char text[5];
  7.     char *p, *outbuf = obuf;
  8.     char *outbuf_end = &obuf[olen];

  9.     char utf16[3];
  10.     int count = 0;
  11.     iconv_t cd = iconv_open("UTF-8", "UTF-16LE");

  12.     if (cd == (iconv_t)-1)
  13.         return 0;

  14.     for (p=ibuf; outbuf<outbuf_end&&*p!='\0'; p++){
  15.         if (count == 0){
  16.             if (*p != '\\')
  17.                 *outbuf++ = *p;
  18.             else
  19.                 count = 5;
  20.             continue;
  21.         }
  22.         assert(count>0);
  23.         text[5-count] = *p;
  24.         count--;
  25.         char *inptr = utf16;
  26.         int code = 0;
  27.         size_t inlen = 2;
  28.         size_t outlen = outbuf_end-outbuf;
  29.         if (text[0] != 'u'){
  30.             *outbuf++ = '\\';
  31.             *outbuf++ = *p;
  32.             count = 0;
  33.         }else if (count == 0){
  34.             sscanf(text+1, "%x", &code);
  35.             utf16[0] = code;
  36.             utf16[1] = (code>>8);
  37.             iconv(cd, &inptr, &inlen, &outbuf, &outlen);
  38.         }
  39.     }
  40.     iconv_close(cd);
  41.     return outbuf-obuf;
  42. }

  43. int main(int argc, char *argv[])
  44. {
  45.     char *title = "aaagooohelp\\u6d4bbaidu";
  46.     /* char *title = "aaagooou6d4bbaidu"; */
  47.     char buffer[1024];
  48.     int count = jsstring_conv(title, buffer, sizeof(buffer)-1);
  49.     buffer[count] = 0;
  50.     printf("%s\n", buffer);
  51.     return 0;
  52. }

复制代码

[ 本帖最后由 pagx 于 2009-2-9 22:49 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2009-02-10 14:24 |只看该作者
这是我的程序中的一段代码,是将UTF8转至GB2312没有问题的
string Utf8toGb2312(const string sstr) const
{
        string tostr;
               
        size_t inlen, outlen;
        iconv_t cd;
        char *outPtr, *outbuf;
        const char *inbuf ;
       
                // 从 UTF-8 转至 GB2312
                cd = iconv_open("GB2312", "utf-8");
       
                if(cd != 0 && sstr!= "" )
                {
                        inbuf = (char*)sstr.c_str();
                        inlen = (size_t)strlen(inbuf);
                        outlen = inlen * 8;
                        outbuf = (char*)malloc(outlen);
                        memset(outbuf, 0, outlen);
                        outPtr = outbuf;
                        if (iconv(cd, &inbuf, &inlen, &outPtr, &outlen)==-1)
                        {
                                               printf("Encoding Error!");
                                                       return "";
                                                 }
                        tostr= outbuf;
                        free(outbuf);
                        iconv_close(cd);
                }
                return tostr;
}

[ 本帖最后由 fly6 于 2009-2-10 14:26 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2009-02-10 18:48 |只看该作者
喔,原来是这样,感谢fly6的提醒,也感谢ynchnluiti (andy)的一直的支持,问题解决了,衷心的谢谢各位了,谢谢!

论坛徽章:
0
17 [报告]
发表于 2009-07-02 21:10 |只看该作者
我也问个问题:

我现在一个二进制文件中的连续6个字节的16进制值把dump出来为:
61  61  e5  8d  a1  e7  8c  aa  62  62
我确定对应的字符串是'aa卡猪bb',我应该怎么把它转换出来?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP