关于utf-8下一个汉字需要三个字节的一些问题

Baymax_W 发布于 10/10 10:12
阅读 1K+
收藏 0

最近在看编码的一些知识,关于utf-8下一个汉字占三个字节,有一些不是很明白的地方,希望有大神可以帮着解答一下:

1. 关于为什么占3个字节,我查了一些资料,有的回答说是如果两个字节只有11位是用来表示字符的,与unicode用16位来表示字符是相悖的,3个字节正好有16位是来表示字符的,

我对于这个回答持有怀疑态度,1)utf-8最长应该是4个字节,那如果是4个字节的话,有21位来表示字符,这是不是也与16位来表示字符是相悖的 2)如果只有一个字节,或者两个字节,那怎么来理解unicode16位来表示字符 3)utf-8中汉字占3个字节的原因是不是因为常用的汉字给划分到了3个字节长度的地址内

 

2. utf-8应该不是所有汉字都占3个字节吧,应该有的会占4个字节吧

加载中
1
osc_82722731
osc_82722731

utf8是压缩格式,每个字符占用的字节是动态的,以节省空间。所以每个字符占用的字节数,应该是根据该字符的编码决定的。

1
kentxp
kentxp

https://my.oschina.net/u/988317/blog/1490346    

至于你说 为啥编码要弄成这么长  我认为就和为啥名字是3个字 2个字一样,   规定而已 ,当年在做unicode编码的那帮人    要考虑

所有的符号进行编码 ,所以肯定对中文,分配了一个区间去表示,正好这个区间 ,最后转换为utf-8表示在3个字节的居多而已

1
前端大师傅
前端大师傅

楼主理解是错误的,unicode是2个字节没错,但并不是只占两个字节。unicode是由组和平面构成,当前只用到了17个组,即 0x 00 0000至0x10 FFFF 请注意0x00-0x10 加上FFFF则是16+1即17个plane平面。一个平面是0xff ff 两个字节。而不是楼主所说的共两个字节。这点不知道是谁教的真是误人子弟。17组*65536 = 1114112。

unicode是字符编码的规范和标准和utf-8、utf-32这些并无直接联系。而我们所常知的utf-32、utf-8都是一种方案实现。即具体规定数字如何转换成字符,字符如何实现数字化存储则需要具体的编码实现如utf-8。

utf-8并不是3个字节,而是1-3个字节来存储字符的编码方式。可笑现在那些知道java是4个英文字母、听说过utf8就以为自己很厉害,不知道自己连门都没摸到。可变长度的utf-8编码方式,可以极大的节约内存占用。当然这也是有前提的,就是在处理西欧字符时是1个节字,而中文则是3个字节。如果只是处理英文或西欧语言utf-8是好的方式。也就是为什么大多数歪国人的软件应用都是utf-8因为他们只需要处理英文。而ansi也就是Gb18030或以前的GB2312处理英文也是2个字节。

而国内的一班半吊子所谓程序员,人云亦云,听别人说uft-8要好,都用utf-8结果由于中英文是1-3个字节,非常容易出错。出了差也不知道如何解决。会几行java代码就以为自己是程序员了,写出来的所谓的app性能又差还bug一大堆。根本不了解在处理中文时ansi优于utf-8。

3.并不存在所谓的4个字节全编码存储的utf-8,这是楼主自己发明的吧。

 

魔力猫
魔力猫
现在除了文字,还有一大堆颜文字,符号图案要存,如果你不用4字节的编码方案,等着有存不进去的吧!这个问题,MySQL的用户可没少被坑。MySQL的Utf8和utf8mb4让多少菜鸟吐血。
haitaosoft
haitaosoft
ansi的问题在于 无法同时表达多种语言(如中日韩。。。。)
piaoyaoi
piaoyaoi
别骂了,这就去转行搬砖
1
娱乐你我
娱乐你我

Unicode 3.1 B扩展 特殊汉字   𠀀𠀁... 编码占了4字节

1
sprouting
sprouting

汉字不一定是三个字节

魔力猫
魔力猫
偏僻字有4个的。
1
RogerLee
RogerLee

UTF8是变长编码

每一个byte前面有1-4个bit用来标识自己的编码长度

比如说2个byte长度的编码

110X XXXX
10XX XXXX
那么实际上,可以用来编码的bit只有11位
1
元谷
元谷

@RogerLee 说的没有错。英文字符是26个字母。一个字节有0xFF个字符(也就是ascall码),足够用了。如果要让这个计算机支持中文,那又不够用了,所以需要用至少两个字符来表示一个汉字。GB2312两个字节基本上能够表示全部的汉字。但是它只能用于中文,如果需要表示什么阿拉伯之类的文字又不够用了。所以出现了utf8,它的格式就如@RogerLee 说的那样子。它的目标是用一个编码表示全球所有的文字。而中文大部分刚好落在三个字节的区域上。打了这么多,希望你能理解它,别纠结了。哈哈

0
d
dwcz

写个代码自己看看就明白的东西。没必要问。

0
国栋
国栋

如果你确实很想知道, 看完我这个系列的你就很清楚了,  https://my.oschina.net/goldenshaw?tab=newest&catalogId=536953, 不过整个系列很长,  你的问题大概看完"字符集与编码(一), (二), (四)" 这三篇即可, 你的疑问都可以得到解决

返回顶部
顶部