回 帖 发 新 帖 刷新版面

主题:UTF-8字符串转换成GBK字符串,使用iconv库函数该怎么处理!

比如“%E9%9D%92”对应汉字“青”,我使用下面这种方法能搞定一半
char instr[4];
instr[0] = 0xe9;
instr[1] = 0x9d;
instr[2] = 0x92;
instr[3] = 0;
然后在用iconv函数可以转换得到“青”。
但现在我需要对字符串“123,she%E9%9D%92”解释成“123,she青”....
不知道该怎么做了。。。

回复列表 (共1个回复)

沙发

我自己写的。。可以转换成功了
int toint(char ch)                        //16进制转换为10进制
{
    int des;
    switch(ch) 
    {
    case '0': des = 0; break;
    case '1': des = 1; break;
    case '2': des = 2; break;
    case '3': des = 3; break;
    case '4': des = 4; break;
    case '5': des = 5; break;
    case '6': des = 6; break;
    case '7': des = 7; break;
    case '8': des = 8; break;
    case '9': des = 9; break;
    case 'a': des = 10; break;
    case 'A': des = 10; break;
    case 'b': des = 11; break;
    case 'B': des = 11; break;
    case 'c': des = 12; break;
    case 'C': des = 12; break;
    case 'd': des = 13; break;
    case 'D': des = 13; break;
    case 'e': des = 14; break;
    case 'E': des = 14; break;
    case 'f': des = 15; break;
    case 'F': des = 15; break;
        
    default: break;
    }
    return des;
}
void utf8togbk(char* src, char* des)             //将utf-8编码的字符串转换为 GB2312编码
{
    char outbuf[256];                           //输出的字符串

    size_t len = strlen(src);
    char instr[256] = {0};                      //输入字符串解码后的字符串
    for (int k =0, j =0; k < len;)              //将输入的字符串中汉字进行解码
    {
        if (src[k] != '%')
        {
            instr[j] = src[k];
            k++;
            j++;
            continue;
        }
        instr[j] = 16 * toint(src[++k]) ;
        instr[j] += toint(src[++k]);
        k++;
        j++;
    }
    
    size_t inlen = strlen(instr);
    size_t outlen = sizeof(outbuf);
    
    iconv_t cd;                                     //使用iconv库函数进行编码转换

    char *pin = instr;
    char *pout = outbuf;
    
    cd = iconv_open("gb2312","utf-8");            //将源utf-8编码转换为gb2312
    if (cd==0) return;
    memset(outbuf,0,outlen);
    
    if (iconv(cd,&pin,&inlen,&pout,&outlen)==-1) return;      
    iconv_close(cd);

    strcpy(des, outbuf);
    
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册