您的位置 首页 > 德语常识

java德语字符乱码?一个逗逼程序员解说

很多朋友对于java德语字符乱码和一个逗逼程序员解说不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

你的编程道路上一定遇到过这些东西:"?怨?蝚?","???è??????-¥","??’???°?÷???1?????";

什么东东啊?第一次遇到这玩意,我(西岭老湿)基本就是这样的:

哈哈,没错,在我们天朝的编程江湖中,这就是大名鼎鼎的:乱码;

如果你稍微有点经验,这些东西也不难解决,相信你也一定能解决,无非就是统一编码或者叫统一字符集而已;

数据库使用UTF8,我们把代码文件改成UTF8,代码的头声明里也用UTF8,浏览器也改成UTF8。这些地方都统一使用一种编码后,基本99.99%的乱码问题都会被我们解决;

但是,你有木有想过,为什么统一编码就能解决问题了,编码或者字符集是个神马东西吆,为何如此神奇啊?

好了,带着刨根问底的优秀品质(分明就是钻牛角尖)我们来和编码字符集做一个赤身裸体的面谈;

首先这要追溯到互联网遥远的上古时代(接着吹,计算机发明还没有100年呢),话说计算机一出生,人家就只认识0、1,当然现在也没什么进步(堕落的家伙),而0、1这样的东西,被我们人类定义为二进制,0代表没有,1代表有;

但是计算机他妈(我是文明人你们不要断错句)稍微有点文化,于是教育计算机说:我给你8个01这样的东西,他们的位置可以随意变化,而一种变化就代表一种含义,类似于:01100001代表八进制141、十进制97、十六进制61、小写字母a;01010010代表八进制122、十进制82、十六进制52、大写字母R;在记忆的时候,8个01占用1个字节的脑容量,1个字节就占用8个位的脑容量,这家伙记忆力相当不错啊;

他妈就把这8个01所有变化的可能性都拿出来,做了一张表,但是做完这张表发现,最多只有256种结果,于是就把他妈使用的语言字母(英文字母)全部对应到这张表里,还顺便把一些标点符号也做了对应,更顺便的给这个表起了名字叫:ASCII;见下图↓

于是,计算机这个小娃娃按照他妈给他的这套规则,顺利的和老妈进行对话交流,无比欢乐;但是,由于计算机这个小娃娃活蹦乱跳还能干活,而且时不时还能耍贱卖萌,甚是可爱,绝对是居家旅行的必备良品,很多人都想和他交流探讨出去浪,成为好基友;可是他妈只给了他一套规则,别的他肯定是不懂啊,这个时候,很多的怪蜀黍就出现了,给这个小娃娃按照自己的规则制定了一套类似的表格,也给这些规则表起了各种名字;

于是这种表格,我们就习惯性的统称为字符编码,而表格里的内容(就是对应的规则)我们统称为字符集;

但是,这些怪蜀黍在制定规则的时候遇到了问题,比如我们天朝这位比较深邃苍老的蜀黍发现,中华文化的博大精深还真不是这个小孩子用8个01就能掌握的,国家在1988年公布的《现代汉语常用字表》选收了2500个常用字、1000个次常用字,总共只有3500字;而算上罕用字,古汉语字,日韩等国的汉字衍生字则有近10万个汉字;

这时聪明的天朝专家们在ASCII的基础上,把原来ASCII码表里127以上的搞不懂的火星文去掉,规定:一个小于127的字符的意义与原来(就是ASCII)相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们组合出大约7000多个简体汉字,每个汉字占用2个字节的脑容量,而这就是GB2312字符编码;

有了这套编码,我们天朝(还有新加坡)就和这个小娃娃没羞没臊的过上了幸福的小日子,但是,柴米油盐酱醋茶,时间一长就发现,7000个汉字根本不够用啊,于是我们的专家们又搞了一套叫GBK的编码,当然了肯定是兼容GB2312的;

就这样,各位怪蜀黍都给了计算机自己定制的编码规则,也都生活在自己的桃花源(单机时代);但是天要下雨娘要嫁人,这小孩逐渐长大,他就想和其他小孩一起浪(开门接客,互联网时代到来),然后就发现,完蛋玩意,你说啥他说啥,谁也听不懂谁;你跟我说了一段德语编码后的二进制01,结果我在解读的时候用GB2312的汉语编码规则解读,那肯定就乱码了呀,所以就↓

那么此时,肯定有小伙伴们问了:西岭老湿,那后来怎么样了?如何解决的啊?

好了,好了,都别急啊,都已经凌晨了,让老夫先睡会啊(世界都无法沟通了,还有心情碎觉,滚起继续……);

为了解决各种语言使用不同的编码规则,西岭老湿带领各国领导和语言学家及计算机大拿们(当然,我在吹牛),制定了万国码,就是我们俗称的Unicode编码,这套规则就厉害了,能把世界上所有的语言全部找到对应的规则,这么腻害的东西是怎么搞的?嘿嘿,偷偷告诉你,其实Unicode是使用4个字节来表示一个字的,也就是说,这套规则理论上可以容纳2的32-1次方个字(数学公式不会写,就文字表达吧),那是多少呢?一五得五,二五一十,三五二十五,五五二十八,嗯嗯,算出来了,大概是21亿左右的样子,以人类现在语言和文字的增长速度,再用几万年应该是没有问题哒(心中长舒一口酒气,那就好,那就好);

对于英文(严格来说,英文字母应该叫拉丁字母,严肃脸)来说,伦家本来一个字节就可以横行天下了,你非得给我4个字节,太浪费了,伦家不要啊……

还有就是,计算机怎么知道,四个字节表示一个Unicode中的字符,还是分别表示四个ASCII的字符呢?又TM乱了……

就是这两个问题,一困扰着Unicode,也使其在推广上遇到了各种难题,直到BenThomson大神在吃饭时灵机一动,在一张餐巾纸上,设计出了第一个版本的UTF8(这个是真的,爱信不信);其实UTF8是Unicode的一种实现方式,而Unicode是一个统一标准规范,Unicode的实现方式除了UTF8还有其它的,比如UTF16、UTF32等。

西岭老湿的好基友阮一峰老师说,UTF-8的基本规则,其实可以简单概括成两条:

-规则1:对于单字节字符,字节的第一位为0,后7位为这个符号的Unicode码,所以对于拉丁字母,UTF-8与ASCII码是一致的。

-规则2:对于n字节(n>1)的字符,第一个字节前n位都设为1,第n+1位为0,后面字节的前两位一律设为10,剩下没有提及的位,全部为这个符号的Unicode编码。

通过以上简单规则,UTF8采取变字节的方式,解决了我们前文提到的关于Unicode的两大问题。同时,作为中文使用者需要注意的一点是Unicode(UTF8)与GBK、GB2312这些汉字编码规则是完全不兼容的,也就是说这两者之间不能通过任何算法来进行转换,如需转换,一般通过GBK查表的方式来进行。

好了,我要出去浪了,谈话就到这吧,相信你也懂了字符编码,如果还是不懂,那么我建议你

如果你懂了,但是并没有关注我,那么:

关于java德语字符乱码的内容到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023