首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

<iconv.h>编码转换有关问题

2013-07-01 
iconv.h编码转换问题求哪位指点一下size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char

<iconv.h>编码转换问题
求哪位指点一下
size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)函数的用法.
查了很久,总是看到说iconv会改变inbuf和outbuf的指向,但是就是找不到具体用法。

这里是我写的一个测试函数,在处理的时候,总是只处理前半部分字符串,是为什么?

#include <iconv.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * icon(char *str, const char *fromcode, const char *tocode);

int main ()
{
char a[] = " a汉字99@#$99汉字en&%\0";
printf("原始: %s \n",a);
icon(a, "UTF-8", "GBK");
printf("更改: %s \n",a);
icon(a, "GBK", "UTF-8");
printf("还原: %s \n",a);
getchar();
return 0;
}

char * icon(char *str, const char *fromcode, const char *tocode)
{
size_t inlen = sizeof(str);
iconv_t cd = iconv_open(tocode, fromcode);
size_t outlen = inlen * 4;
char *outbuf = (char *)malloc(outlen);
if (!outbuf)
{
exit(1);
}
memset(outbuf, 0, outlen);

char *in = str;
char *out = outbuf;
if (-1 == iconv(cd, &in, (size_t *)&inlen, &out, &outlen))
exit(1);
outlen = strlen(outbuf);
strcpy(str, outbuf);
free(outbuf);
iconv_close(cd);
return str;
} linux?iconv linux iconv 编码转换 socket乱码
[解决办法]
参考我之前的代码:


#include <stdlib.h>
#include <string.h>
#include <iconv.h>
#include <stdio.h>
 
#define hz_offset(hz)    (((hz[0] - 0xa1) * 94 + (hz[1] - 0xa1)) * 32)
 
/* 字符串转码 */
int decoding(char* from_charset, char* to_charset, char* inbuf, int inlen, char* outbuf, int outlen)
{
    iconv_t cd;
    char** pin = &inbuf;
    char** pout = &outbuf;
 
    if((cd = iconv_open(to_charset, from_charset)) == (iconv_t)0)
    {
        return -1;
    }
 
    memset(outbuf, 0, outlen);
    if(iconv(cd, pin, &inlen, pout, &outlen) == -1)
    {
        iconv_close(cd);
        return -1;
    }
 
    iconv_close(cd);
    return 0; 
}
 
/* 汉字从UTF-8转为GB2312编码 */


int hz_decoding(char* hz_utf8, char* hz_gb2312)
{
    return decoding("utf-8", "gb2312", hz_utf8, 3, hz_gb2312, 3);
}
 
/* 打印汉字 */
void hz_show(unsigned char* datas)
{
    int i;
    int j;
    int k;
    unsigned char ch;
 
    for(i = 0; i < 16; i++)
    {
        for(j = 0; j < 2; j++)
        {
            ch = datas[i * 2 + j];
            for(k = 0; k < 8; k++)
            {
                if(ch & 0x80)
                {
                    printf("%c ", '*');
                }
                else
                {
                    printf("  ");
                }
                ch <<= 1;
            }
        }
        printf("\n");
    }
}
 
int main(int argc, char* argv[])
{
    FILE* hzk;
    unsigned char hz_utf8[3] = "宋";
    unsigned char hz_gb2312[3];
    unsigned char hz_datas[32];
 
    hz_decoding(hz_utf8, hz_gb2312);
    printf("%x, %x\n", hz_gb2312[0], hz_gb2312[1]);
 
    if((hzk = fopen("simhei_gb2312_16.ds", "rb")) == NULL)
    {
        return -1;
    }
 
    fseek(hzk, hz_offset(hz_gb2312), SEEK_SET);
    fread(hz_datas, 32, 1, hzk);
    hz_show(hz_datas);
 
    fclose(hzk);
    return 0;
}



引用:
求哪位指点一下
size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)函数的用法.
查了很久,总是看到说iconv会改变inbuf和outbuf的指向,但是就是找不到具体用法。

这里是我写的一个测试函数,在处理的时候,总是只处理前半部分字符串,是为什么?

#include <iconv.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * icon(char *str, const char *fromcode, const char *tocode);



int main ()
{
char a[] = " a汉字99@#$99汉字en&%\0";
printf("原始: %s \n",a);
icon(a, "UTF-8", "GBK");
printf("更改: %s \n",a);
icon(a, "GBK", "UTF-8");
printf("还原: %s \n",a);
getchar();
return 0;
}

char * icon(char *str, const char *fromcode, const char *tocode)
{
size_t inlen = sizeof(str);
iconv_t cd = iconv_open(tocode, fromcode);
size_t outlen = inlen * 4;
char *outbuf = (char *)malloc(outlen);
if (!outbuf)
{
exit(1);
}
memset(outbuf, 0, outlen);

char *in = str;
char *out = outbuf;
if (-1 == iconv(cd, &in, (size_t *)&inlen, &out, &outlen))
exit(1);
outlen = strlen(outbuf);
strcpy(str, outbuf);
free(outbuf);
iconv_close(cd);
return str;
}


[解决办法]
是什么意思,还望指点

sizeof(str)是指针变量的大小,而不是字符串中的字符数量。

热点排行