黑马程序员技术交流社区

标题: 关于UTF-8?? [打印本页]

作者: 董波    时间: 2013-4-28 16:36
标题: 关于UTF-8??
本帖最后由 董波 于 2013-5-2 12:28 编辑

毕老师的视频中说UTF-8最长是以3个字节表示一个字符的,今天又在网上看到这么一句话:“UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。”
UTF-8最长到底是以3个字节还是4个字节表示一个字符的??


作者: cowthan    时间: 2013-4-28 16:41
我还看见utf-8能以1到6个字节表示一个符号呢
作者: 杨同旺    时间: 2013-4-28 16:50
本帖最后由 杨同旺 于 2013-4-28 17:01 编辑

utf-8是变长编码,实际采用1,2,3,4,5,6个字节来表示一个Unicode字符,

不同种类的字符使用不同的长度,记住常用的中文和英文字符的字节长度,

英文字符使用1个字节来表示

中文字符使用3个字节来表示

其它长度的utf-8所表示的字符并不常用,可能是世界上其它国家的字符

作者: 肖宇宥    时间: 2013-4-28 16:55
UTF-8是UNICODE的一种变长字符编码.
F:\utf-8.png
作者: 肖宇宥    时间: 2013-4-28 16:56
刚刚传图片传错了,不好意思

utf-8.png (15.39 KB, 下载次数: 0)

utf-8.png

作者: 袁梦希    时间: 2013-4-28 16:57
楼主你好:

UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),
中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8节省空间。
GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。
GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。
比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。
所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

作者: 付鑫鑫    时间: 2013-4-29 09:10
是这样,UTF-8,它是国际上通用的码表.就是他可以识别世界大部各国的语言.
当初UTF-8的出现就是为了解决,用一种码表就统一表达各国的语言.
例如,UTF-8没有出现之前,中国用一种码表,日本用一种码表,韩国用一种码表,美国有一种码表,就会产生混乱,不好识别.
对了,UTF-8对中文字符是三个字节表示一个字符,和GBK有区别,GBK占两个字节,这就是为什么会出现乱码的原因.
而英语是一个字节表示一个字符

作者: lyg2013    时间: 2013-4-29 09:32
UTF-8详解UTF-8用1到6个字节编码UNICODE字符
UTF8修正更新java使用UTF-16表示内部文本,并支持用于字符串串行化的非标准的修正UTF-8编码。UTF-8保存使用  UTF-8保存使用
标准UTF-8和修正的UTF-8有两点不同:
修正的UTF-8中,null字符编码成2个字节(1100000010000000)而不是标准的1个字节(00000000),这样作可以保证编码后的字符串中不会嵌入null字符。因此如果在类C语言中处理字符串,文本不会在第一个null字符时截断(C字符串以'\0'结尾)。
在标准UTF-8编码中,超出基本多语言范围(BMP-BasicMultilingualPlain)的字符被编码为4字节格式,但是在修正的UTF-8编码中,他们由代理编码对(surrogatepairs)表示,然后这些代理编码对在序列中分别重新编码。结果标准UTF-8编码中需要4个字节的字符,在修正后的UTF-8编码中将需要6个字节
作者: 董波    时间: 2013-4-29 09:49

这个问题我已经解决了:
UTF-8中确实有用4个甚至6个字节表示一个字符的情况,但这在java中应该不会出现,因为java中使用的好像是UTF-8修改版,该修改版使用的是1、2或3个字节表示一个字符,所以毕老师说的也是没错的。感兴趣的兄弟可以到JDK文档的java.io.DataInput的部分。
<问题已解决,不过还是以"未解决"状态挂两天吧,让看视频有同样困惑的兄弟参考一下。>

作者: Sword    时间: 2013-4-30 01:18
具体来说,UTF-8编码有以下几种格式:

U-00000000 – U-0000007F:         0xxxxxxx
U-00000080 – U-000007FF:         110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:         1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:         11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:         111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:         1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

第 一个字节要么最高位是0(ASCII字节),要么最高两位都是1,最高位之后1的个数决定后面有多少个字节也属于当前字符编码,例如111110xx,最 高位之后还有四个1,表示后面有四个字节也属于当前字符的编码。后面每个字节的最高两位都是10,可以和第一个字节区分开。这样的设计有利于误码同步,例 如在网络传输过程中丢失了几个字节,很容易判断当前字符是不完整的,也很容易找到下一个字符从哪里开始,结果顶多丢掉一两个字符,而不会导致后面的编码解 释全部混乱了。上面的格式中标为x的位就是UCS编码,最后一种6字节的格式中x位有31个,可以表示31位的UCS编码,UTF-8就像一列火车,第一 个字节是车头,后面每个字节是车厢,其中承载的货物是UCS编码。UTF-8规定承载的UCS编码以大端表示,也就是说第一个字节中的x是UCS编码的高 位,后面字节中的x是UCS编码的低位。

例如U+00A9(©字符)的二进制是10101001,编码成UTF-8是11000010 10101001(0xC2 0xA9),但不能编码成11100000 10000010 10101001,UTF-8规定每个字符只能用尽可能少的字节来编码。
作者: 刘沛霞    时间: 2013-4-30 10:16
UTF-8用1到6个字节编码UNICODE字符。
作者: 黄玉昆    时间: 2013-4-30 23:27
董波 发表于 2013-4-29 09:49
这个问题我已经解决了:
UTF-8中确实有用4个甚至6个字节表示一个字符的情况,但这在java中应该不会出现, ...

童鞋,如果挂的差不多了,就改一下吧,因为每天帖子数量太多了,谢谢了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2