LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 828|回复: 4

utf8的问题

[复制链接]
发表于 2007-1-8 09:22:22 | 显示全部楼层 |阅读模式
比如“测”的utf8编码是“e6, b5, 8b”.

char *name = "测";
int i;
for(i = 0; i<strlen(name); i++)
    printf("name = %x\n", name);

按说应该打印的是“0xe6, 0xb5, 0x8b”阿,可是打印出来的是“0xffffffe6, 0xffffffb5, 0xffffff8b”

这是什么原因呢?
发表于 2007-1-8 10:02:59 | 显示全部楼层
改成unsigned char *name
回复 支持 反对

使用道具 举报

发表于 2007-1-8 16:22:21 | 显示全部楼层
你的问题是“测”这个字在UCS中是用e6, b5, 8b这样一个数来表示的。(具体我不知道,可以方便查到),你想用个程序查看一下,结果程序给出了“错误”的值。
如果你的问题我理解的对,那么你不了解UCS值与UTF的关系,不多说了,受你以渔!
去查看几个关键词:(不用中文了,容易误解)
char set , encond , UCS , UTF。弄清了这几个关键词就可以理解的自己写的程序了。
再给个连接:http://www.cl.cam.ac.uk/~mgk25/unicode.html
回复 支持 反对

使用道具 举报

发表于 2007-3-24 16:34:01 | 显示全部楼层
Post by whshuai
比如“测”的utf8编码是“e6, b5, 8b”.

char *name = "测";
int i;
for(i = 0; i<strlen(name); i++)
printf("name = %x\n", name);

按说应该打印的是“0xe6, 0xb5, 0x8b”阿,可是打印出来的是“0xffffffe6, 0xffffffb5, 0xffffff8b”

这是什么原因呢?

因为你打印出来的是utf8编码的数值

而e6,b5,8b是“测”的unicode码

需要从utf8转换成unicode

有专门的码表和算法
回复 支持 反对

使用道具 举报

发表于 2007-3-24 23:38:18 | 显示全部楼层
LS两位有点误人子弟了。哪有那么复杂,又是UCS、UTF,又是码表转换的。
这个char *name实际就四个字节,"\xe6\xb5\x8b\0",用printf打印的时候,因为%x要求一个整数,'\xe6'又是一个有符号数(char)的-26,被作为整数-26(4个字节)打印,就是FFFFFFE6。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表