MyException - 我的异常网
当前位置:我的异常网» Java Web开发 » 大家来讨论一下unicode和utf-8解决方案

大家来讨论一下unicode和utf-8解决方案(2)

www.MyException.Cn  网友分享于:2013-01-20  浏览:82次

------解决方案--------------------
学习
------解决方案--------------------
没深入地/./.
学习
------解决方案--------------------
谢谢
------解决方案--------------------
文件 ->servlet -> 浏览器,这中间发生了很多转换?楼主能给讲讲吗?~或者提供点资料,链接什么的?
------解决方案--------------------
我一般就用GB2312,用别的怕出乱码
------解决方案--------------------
学习
------解决方案--------------------

------解决方案--------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
------解决方案--------------------
问题1,2,楼主理解基本正确。

问题3:
Windows/Linux 是Big Endian
Unix 是Little Endian
------解决方案--------------------
探讨
Unicode包含了超过十万个字符, 而Java语言就是用UTF-16格式将字符存储在内存中的,于是我的问题又来了:
java中定义char最大为65535, 那又怎么能说明Unicode包含了超过十万个字符呢?

------解决方案--------------------
我对unicode编码的理解是这样:unicode编码采用32位来表示一个字符,所以几乎可以表示世界上现有的所有
语种的所有文字符号。这样的好处是显而易见的,若大家都用这个编码的话,就没有今天让我们烦人的乱码
问题了。但是这样是有代价的就是存控件浪费严重.为了节省空间于是大家对unicode进行了扩展于是有了
utf-8,utf-16,utf-32
utf按unicode方式查找字符,后面的数字代表默认采用几个字符来存储字符的码表序号,一个字符存不下就
扩展为两个,两个存不下用4个.
所以对只有英文字母组成的问价来说用utf-8编码和用assi编码是一样的,因为没有需要采用扩展存储的符号。
如果采用utf-16编码的话即使你的文章中全部是英文,每个英文也必须用两个字节来存储,

------解决方案--------------------
utf-8 不是为了节约空间,反而会比Unicode浪费空间(Unicode编码要两字节,utf-8是变长编码,有一字节、两字节、三字节, 一般存储一个中文要三个字节,实际上比Unicode编码还多一个字节),那么为什么还要用utf-8编码呢 ? 这主要是utf-8容错能力好。比如从网络传输一个字符串 “字符编码介绍”,用Unicode编码的话,传输的实际内容是十六进制表示“57 5B 26 7B 16 7F 01 78 CB 4E CD 7E”(前两个字节0x5B57是“字”的Unicode编码,0x7B26是“符”的Unicode编码、、),假如由于网络错误接收者收到的“57 5B 26 7B 16 7F 01 78 CB 4E CD 7E”不完整, 丢了一个字节,成了“57 5B (26丢了) 7B 16 7F 01 78 CB 4E CD 7E”,“符”本来要两字节,现在丢了一个,就导致“符”显示乱码,并丢的这个字节还直接影响了后面的“编码介绍”,使他们都变成了乱码, 最终解码出来的样子就是"字ᙻſ쭸쵎~踀䦎䵄躎", 所以用Unicode编码传输起来很不可靠。 
如果用utf-8的话, 丢掉其中一个字符的某个(或几个)字节,只是对这个字符有影响,对他后面的字符没有影响,后面的字符一样可以正常显示。 这个比Unicode可靠些了。
附一个汉字编码查询的网站:http://bm.kdd.cc/index.asp
------解决方案--------------------
问题一,楼主的理解无比正确,unicode本身定义的就是每个字符的数值,是字符和自然数的映射关系,而UTF-8,或者UTF-16甚至UTF-32则定义了如何在字节流中断字,是计算机领域的概念。

问题二,微软的文化里,提到Unicode,往往指的是UTF-16,这也是目前最常用的UTF规范。微软导致很多人对这个概念的混淆。 所以在微软的软件里,比如记事本,看见Unicode,直接理解成UTF-16,就好理解了。

问题三,不懂java。

至于,为什么会有10万多个字,没错,光我们汉字就有7万多个,这是UTF-16的一种机制,称为surrogate机制,在特殊情况下使用2个WORD来表示一个字符,和内码一样,用特殊的WORD区段表示引导WORD,和后续WORD一起用32位表示一个字符。微软系统从win2K开始支持这种机制。楼主不让发链接,大家自己去搜吧。

所以说UTF-16一定是2个字节表示一个字符,这种说法严格意义上是错误的,但是绝大多数情况下也不会出什么问题。毕竟这些4字节字都是非常非常冷僻的字。

举个例子,大家可以打开WORD,字体切换成方正超大字符集,然后插入->符号,子集选成CJK统一汉字扩充B,这些就是4字节的汉字,打赌这些字你一个也不认识。
------解决方案--------------------
utf8 是 unicode 值的一种存储方式,就象维基百科里介绍的那样,用来存储不定长的字符,根据模板解析,而且文本中间出现损坏、缺失的情况不会使整体文本被打乱,缺点是,要根据编码进行解析,浪费了处理时间。

比如:
一个1字节长的ascii字符,第一字节是0开始的,也就是说是个无符号数;
一个2字节长的字符,第一个字节由110开始,接着的字节由10开始;
一个3字节长的字符,第一个字节由1110开始,接着的字节由10开始;
4字节的就不用介绍了。

这就象一个模板,这些部分是用来给解析器用的,真正的值需要根据首字节的标识来进行重新装配。
后面的字节因为都是10开头的(有符号数),假设中间由于某种情况导致损失了一个字节,并不会象
传统编码那样导致后面的字符会跟着受影响,因为,10这个特殊的头部满足了才表示是后续字节,否
则就是其它字符的开始。

问题2,有标识头:
00000000h: FF FE 31 00 32 00 33 00 ; ?.2.3.
这是一个"123"的文本

问题3,见23楼
------解决方案--------------------

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有