-1

我在将 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 

谢谢,桑迪普

4

4 回答 4

2

看起来您正在以小端格式输出 UTF-16:

ff fe 41 00 ...

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

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

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

于 2011-01-16T12:06:32.050 回答
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,除非第一个字节是字节顺序标记(BOM) 值 0xfeff 以指示字节顺序方案。

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

于 2011-01-16T12:11:35.350 回答
0

UTF-8 是 Unicode。

除非您需要其他类型的 Unicode 编码,例如 UTF-16 或 UTF-32,否则您不需要进行隐蔽

于 2011-01-16T11:40:40.583 回答
0

UTF 不是 Unicode。UTF 是 Unicode 标准中的整数编码。照原样,这个问题毫无意义。如果您的意思是要从(任何)UTF 转换为 unicode 代码点(即代表分配的代码点的整数,大致是一个字符),那么您需要做一些阅读,但它涉及位移对于 UTF-8 字节序列中的 1、2、3 或 4 字节的值(参见Wikipedia,而Markus Kuhn 的文本也很出色)

于 2011-01-16T11:44:22.220 回答