——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
最近看毕老师的JAVA视频系列,获益颇多,看到IO系列的时候,我关注到一个问题:就是语言与字符集
众所周知,在坑爹的神明和巴别塔的倒掉之后,世界各地人们用的语言五花八门,发音,书写,规则各异。以至于外语成了当今世界交流越来越频密的必须品。
这个暂不细表,说不定哪天张公子会去写一篇譬如《论巴别塔的倒掉》之类的。
自发明计算机后,文字的表示与输入成了紧迫需求,随之而来的便是一整套的计算机文字系统,从键盘到显示器,从编码到字符映射,从输入法到字体,各种系统和规范被开发而来。这两天我也摸了摸编码与字符集的相关问题,轻言浅见,欢迎驳正。
说到字符集,不得不提大名鼎鼎的ASCII,这个用了7bit的基础字符编码表简直无处不在,衍生了无数兼容ASCII的字符集,一般称之为ANSI编码,比如我们的GB系列
GB3212,GBK,GB18030 ,这些字符集都使用了2byte来对应一中文字符,为了兼容ASCII,只使用了低7位,而最高位置1以免与ASCII冲突。
免了和ASCII冲突却免不了和其他字符集冲突,比如日文歌曲中经常出现的乱码,那是SHIFT-JIS码,大家喜闻乐见的港台BIG5繁体编码,还有令人头疼的ISO8859-1,由于ISO8859-1在拉丁语系中覆盖力强,编码只需1字节(8bit),导致很多软件默认使用了它来编码,当然,都是欧美的。这就导致我们想要在这些软件中使用中文成为一件麻烦事。
比如这个很常见的问题:怎么保证流中的中文(GBK编码)不会被“拦腰截断”呢
这是一个对java String 截断的样例:
主要就是在读取结束位置多读取下一个字节来做判断。
为了应对和协调各种语言之间的编码冲突问题,UNICODE应运而生,无论什么语言字符,在Unicode中是拥有一席之地的,最美好的事情是,不会冲突,只是有个问题,Unicode字符太多,编码略长啊。这个不够效率,于是Unicode族中出现了UTF-8,它是基于可变长度的编码,用编码头来标识单个字符的编码长度:
一个字符就是10bbbbbb;两个字符就是110bbbbb:10bbbbbb;三个字符就是1110bbbb:10bbbbbb:10bbbbbb
毕老师的视频里提了一个很有趣的问题:“联通” 因为这俩字符的GB编码刚好都符合Utf-8的2字符规则,于是又冲突了,而且查一查GBK,这种字符有64*32个之多:
遂写个取之:
如果你眼神够好,大概能找到联通俩字
以上
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树IO流概述92666 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!