UTF-8转换为Unicode

时间:2011-01-16 11:30:54

标签: c unicode iconv

我遇到将UTF-8转换为Unicode的问题。

以下是代码:

int charset_convert( char * string, char * to_string,char* charset_from, char* charset_to)
{
    char *from_buf, *to_buf, *pointer;
    size_t inbytesleft, outbytesleft, ret;
    size_t TotalLen;
    iconv_t cd;

    if (!charset_from || !charset_to || !string) /* sanity check */
        return -1;

    if (strlen(string) < 1)
        return 0; /* we are done, nothing to convert */

    cd = iconv_open(charset_to, charset_from);
    /* Did I succeed in getting a conversion descriptor ? */
    if (cd == (iconv_t)(-1)) {
        /* I guess not */
        printf("Failed to convert string from %s to %s ",
              charset_from, charset_to);
        return -1;
    }
    from_buf = string;
    inbytesleft = strlen(string);
    /* allocate max sized buffer, 
       assuming target encoding may be 4 byte unicode */
    outbytesleft = inbytesleft *4 ;
    pointer = to_buf = (char *)malloc(outbytesleft);
    memset(to_buf,0,outbytesleft);
    memset(pointer,0,outbytesleft);

        ret = iconv(cd, &from_buf, &inbytesleft, &pointer, &outbytesleft);ing
    memcpy(to_string,to_buf,(pointer-to_buf);
}

主要():

int main()
{    
    char  UTF []= {'A', 'B'};
    char  Unicode[1024]= {0};
    char* ptr;
    int x=0;
    iconv_t cd;

    charset_convert(UTF,Unicode,"UTF-8","UNICODE");

    ptr = Unicode;

    while(*ptr != '\0')
    {   
        printf("Unicode %x \n",*ptr);
        ptr++;
    }
    return 0;
}

它应该给A和B,但我得到了:

ffffffff
fffffffe
41 

谢谢, 和Sandeep

4 个答案:

答案 0 :(得分:2)

看起来你以小端格式获得了UTF-16:

ff fe 41 00 ...

哪个是U + FEFF(ZWNBSP又名字节顺序标记),U + 0041(拉丁字母大写字母A),...

然后停止打印,因为while循环已在第一个空字节上终止。以下字节应为:42 00

您应该从函数返回一个长度,或者确保输出以空字符(U + 0000)终止并循环,直到找到它为止。

答案 1 :(得分:0)

UTF-8是Unicode。

除非你需要其他类型的Unicode编码,如UTF-16或UTF-32

,否则你不需要隐蔽

答案 2 :(得分:0)

UTF不是Unicode。 UTF是Unicode标准中整数的编码。这样的问题毫无意义。如果你的意思是你想要从(任何)UTF转换为unicode代码点(即代表指定代码点的整数,大致是一个字符),那么你需要做一些读取,但它涉及位移对于UTF-8字节序列中的1,2,3或4个字节的值(请参阅Wikipedia,而Markus Kuhn's文本也非常好)

答案 3 :(得分:0)

除非我遗漏了一些没有人指出的东西,否则“UNICODE”不是libiconv中的有效编码名称,因为它是一系列编码的名称。

http://www.gnu.org/software/libiconv/

(编辑)实际上iconv -l将UNICODE显示为列出的条目,但没有详细信息,在源代码中,它在注释中列为UNICODE-LITTLE的别名,但在其提及的子注释中:

 * UNICODE (big endian), UNICODEFEFF (little endian)
   We DON'T implement these because they are stupid and not standardized.

在别名头文件中UNICODELITTLE(无连字符)解析如下:

lib/aliases.gperf:UNICODELITTLE, ei_ucs2le

即。 UCS2-LE(UTF-16 Little Endian),应与Windows内部“Unicode”编码匹配。

http://en.wikipedia.org/wiki/UTF-16/UCS-2

但是,明确建议您明确指定UCS2-LE或UCS2-BE,除非第一个字节是Byte Order Mark(BOM)值0xfeff以指示字节顺序方案。

<强> =&GT;您将BOM视为输出的第一个字节,因为这是“UNICODE”编码名称的含义,它表示UCS2带有指示字节顺序方案的标题。