java亂碼有哪幾種可能?亂碼跟JAVA沒(méi)有半毛錢關(guān)系,但是JAVA開(kāi)發(fā)中亂碼問(wèn)題隨處可見(jiàn)!

先解釋下亂碼是怎么產(chǎn)生的:

我們都知道計(jì)算機(jī)機(jī)器識(shí)別的是電信號(hào),也就是高低電平,對(duì)應(yīng)數(shù)字中的1和0,也就是說(shuō)所有語(yǔ)言在最后執(zhí)行的時(shí)候都是解釋為0和1了,我們把原本的文字,字母,符號(hào)轉(zhuǎn)化為二進(jìn)制數(shù)據(jù)(0和1的序列)稱之為編碼,反過(guò)來(lái)稱之為解碼!

最早的編解碼規(guī)則是美國(guó)定制的ASCII(美國(guó)信息交換標(biāo)準(zhǔn)代碼),把a(bǔ)-z,A-Z,還有鍵盤(pán)上的一些鍵(空格,tab等)定義了一套轉(zhuǎn)化,比如A是65,對(duì)應(yīng)的二進(jìn)制為01000001。

java亂碼有哪幾種可能

但是ASCII是對(duì)英語(yǔ)量身定做的,對(duì)于中文漢字等不提供支持,所以國(guó)家專門(mén)提出了第一個(gè)中文編碼GB2312,但是GB2312也只提供六千多個(gè)字的編碼,中文博大精深沒(méi)法覆蓋,于是全新的GBK,utf-8等支持中文的編碼相繼出現(xiàn),后來(lái)GBK和utf-8廣泛應(yīng)用在我們的日常開(kāi)發(fā)中。

但是由于各種編碼方式的標(biāo)準(zhǔn)不同,相同的字也可能會(huì)得到不同的編碼,解碼的時(shí)候也會(huì)差異巨大,比如編碼的時(shí)候用utf-8,解碼的時(shí)候使用GBK,解釋出來(lái)的文字可能就是亂碼了!

java亂碼有哪幾種可能

那為什么說(shuō)JAVA中的亂碼很多呢?因?yàn)閬y碼主要發(fā)生在網(wǎng)頁(yè),數(shù)據(jù)庫(kù)存取時(shí),都是JAVA的常用場(chǎng)景,舉例如下:

①,頁(yè)面使用gb2312,后臺(tái)傳數(shù)據(jù)使用別的編碼,可盡量選擇同一個(gè)編碼方式!

②,后臺(tái)接受參數(shù)為亂碼,比如使用tomcat,就很容易出現(xiàn)亂碼,通常在tomcat的server.xml文件中設(shè)置解碼方式,和應(yīng)用程序中添加字符過(guò)濾!

③,讀取文件出現(xiàn)亂碼,按照文件的編碼定義方式來(lái)解碼,讀取!

④,數(shù)據(jù)庫(kù)根據(jù)需要選擇與業(yè)務(wù)系統(tǒng)對(duì)應(yīng)的編解碼方式!

解決辦法:盡量使用同一種編解碼標(biāo)準(zhǔn)!

亂碼也算是開(kāi)發(fā)中比較基本,也比較折磨人的問(wèn)題了,只要注意編解碼對(duì)應(yīng)上就行了。