我遇到将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
答案 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带有指示字节顺序方案的标题。