“a”.getBytes("GBK")为什么等于1
澳门威尼斯人官网
澳门威尼斯人官网
当前位置 : 澳门威尼斯人官网 > www.vn99.net

“a”.getBytes("GBK")为什么等于1

按我的理解,GBK是定长字符编码,不管是中文还是英文,都是两个字节。


"a".getBytes"GBK";   //byte数组理论上长度为2,但其实是1

//其它的一些
“中”.getBytes"GBK";  //byte数组长度为2
“中”.getBytes"UTF-8";    //byte数组长度为3

无论GBK、UTF-8,都是对ASCII的扩展,都是"兼容"ASCII的,a是ASCII字符表里的,就一个Byte,值为97,什么编码都是这个,毫无疑问。

请参考:
http://dengo.org/archives/901
摘录:

后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,
但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,
为了可以在计算机保存他们的文字,
他们决定采用 127号之后的空位来表示这些新的字母、符号,
还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,
一直把序号编到了最后一个状态255。
从128 到255这一页的字符集被称”扩展字符集“。
从此之后,贪婪的人类再没有新的状态可以用了,
美帝国主义可能没有想到还有第三世界国家的人们也希望可以用到计算机吧!

等中国人们得到计算机时,
已经没有可以利用的字节状态来表示汉字,
况且有6000多个常用汉字需要保存呢。
但是这难不倒智慧的中国人民,
我们不客气地把那些127号之后的奇异符号们直接取消掉,
规定:一个小于127的字符的意义与原来相同,
但两个大于127的字符连在一起时,就表示一个汉字,
前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,
这样我们就可以组合出大约7000多个简体汉字了。
在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,
连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,
这就是常说的”全角”字符,
而原来在127号以下的那些就叫”半角”字符了。
中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。
GB2312 是对 ASCII 的中文扩展。

另外,摘录百度百科:

GB2312 也是ANSI编码里的一种,
对ANSI编码最初始的ASCII编码进行扩充,
为了满足国内在计算机中使用汉字的需要……

另外,一个很明显的体验就是:
无论GBK还是UTF-8、ASCII,英文和数字都是不会乱码的,So……

Update:
好吧,有人在评论里表示不信。。。我也是没办法。。。
其实我也是刚才百度了才确认的,就是1个字节,不用怀疑!

举个例子好了:

新建空白的UTF-8的txt文件,可以看到是3个字节(有一个UTF-8 BOM头的字符)。

写10个数字进去,可以看到是13个字节。。。。

不多解释了。。。你们不信的话,就自己慢慢百度、慢慢实验吧233333

国标GB系列字符集只是定义了我们汉字的code point,不是具体的实现方式,像gb2312 就有两种常见的实现方式(也就是我们经常说的编码)

我们要明确,设计一种编码方案要与之前的编码方案(像 ASCII、ISO-8859-1)兼容,现在大多数多字节编码方案都是变长编码。

对于 gbk 来说,它既是一套字符集也是一种编码方案,而且是种变长编码方案,

  • 0x000x7F之间的编码,与 ASCII 保持一致,最高位 0 填充

  • 双字节,第一个字节范围0x810xFE,第二个字节范围407E80 FE 表示汉字等字符

以上回答了题主的问题。

关于这个问题的细节,其实很复杂的多。如果感兴趣,可以静下心来看看我总结的博客

字符串,那些你不知道的事

栏目列表

广告位

澳门威尼斯人官网