日期:2014-05-18  浏览次数:20802 次

大家来讨论一下unicode和utf-8
从一篇帖子开始,http://blog.csdn.net/sfdev/archive/2009/01/13/3770706.aspx, 决定好好探究一下unicode和utf-8的关系.
总算大约明白:unicode是一种编码方式,它涵盖了世界上大多数国家语言字符并对其编码, 使每个编码都唯一; 这个工作使每个字符有了一个编号;也可以说这个工作是把世界范围内的字符映射到一个自然数集。
问题1:我这样理解对么?维基百科中关于unicode的解释中有一句话:Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。
我这样理解这句话:
如果直接用unicode编码存储或传输字符,会遇到问题,因为计算机中存贮,传输的单位是字节,遇到的问题是:不好断字,一个字符占用几个子节无法确定,(还有一个问题是不同系统平台的设计不一定一致,这个先不说);所以需要有一种机制实现编码到字节序列的映射,并且能够标明字符边界:比如utf-8中:在ASCII码的范围的,用一个字节表示,且最高位为0;大于ASCII码的,比如110xxxxxx前三位的二进制表示告诉我们这是个 2BYTE的UNICODE字符;1110xxxx是个三位的UNICODE字符,依此类推.
问题2: 我这样理解unicode的实现方式对么?同时, 既然unicode只是一种编码方式,不是实现方式,那么打开记事本选择:file -> save as -> encoding选项中unicode是指哪种实现方式? unicode little endian?

问题3: String s = new String(new char[]{'A'}); s放的是字符序列,是哪种编码? 平台的编码还是unicode? s.getBytes("utf-8")得到该字符串的utf-8编码方式的byte序列,那么s.getBytes("unicode");又是哪种实现方式? unicode little endian?

欢迎讨论,欢迎指导! 给链接的不要, 因为你看到我都看过.


------解决方案--------------------
unicode好费空间的,我不喜欢。
------解决方案--------------------
纯属学习的。
------解决方案--------------------
大哥,你分用不了志愿小弟几个吧,我经常因为提问给的分少没人回答,真急
------解决方案--------------------
你说的这几个问题我都不懂,顶起。关注中
------解决方案--------------------
我以前这类问题关注很少
学习了不少。。
------解决方案--------------------
问题一:

如果直接用unicode编码存储或传输字符,会遇到问题,因为计算机中存贮,传输的单位是字节,遇到的问题是:不好断字,一个字符占用几个子节无法确定。

并不是传输或存储会遇到问题,使用UTF-8的目的是为了节省空间。而不是“不好断字,一个字符占用几个子节无法确定”

问题二:

项中unicode是指哪种实现方式? unicode little endian? 是的。
unicode的两种存储方式,高位在前,还是高位在后。

问题三:
字符串使用unicode编码。
那么s.getBytes("unicode");又是哪种实现方式? unicode little endian? 
可以测试一下,fe ff 高位在后,我机器测试就是这样的,big endian。
------解决方案--------------------
study
------解决方案--------------------
感觉楼主把编码想象的太深奥了。
我的理解是:为每一个符号加个ID.符号简单的说就是字、特殊字符等等,ID就是符号的编码,不同编码对应的ID不同。就象你的学号(你们学校的字符集)和你的身份证号码(国家的字符集)是不一样的,但都对应的是你。
每台计算机都有字符影射表,收到一个ID的时候会去查找这张表,转成对应的符号。
UTF-8是unicode的变种,就是在unicode的基础上做了有规律的变动。

开始-->运行 输入charmap,可以看到字符影射表.
------解决方案--------------------
学习,帮顶
------解决方案--------------------
上面提到:使用UTF-8的目的是为了节省空间。不正确。如果是英文,的确节省了空间。如果是中文,占的空间到多了。UTF-8传输过程中,如果有字节丢失,对后续字影响小。
------解决方案--------------------
我在用jsp时,出现乱码,就UTF-8,Unicode,Ansi换着试上一遍,不过大部分时间Unicode都不好用,根本连乱码都不出,只出个?。所以现在都不用Unicode。
刚才jsp乱码,用byte b[]=search.getBytes("ISO-8859-1");解决了。ISO-8859-1是不是也是一种国际标准编码方式?或许对你思考问题三有帮助吧
------解决方案--------------------
经常会出现错误。我建议使用EditPlus
------解决方案--------------------
学习了
------解决方案--------------------
hao
------解决方案--------------------
两种编码方式

其他的可以多查查资料 很多的

真的

一起学习了

呵呵
------解决方案--------------------
值得深入。。。学习
------解决方案--------------------
UTF-8是unicode的新版
史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.,