這篇文章主要介紹“為什么idea輸出會(huì)亂碼”,在日常操作中,相信很多人在為什么idea輸出會(huì)亂碼問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”為什么idea輸出會(huì)亂碼”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比思南網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式思南網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋思南地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。
前言
亂碼這個(gè)東西相信大家都遇到過,今天我的女朋友三歪就火急火燎的上來找我:“親愛的,我的idea怎么輸出亂碼了?”
我一頓操作就給他搞好了,但是三歪不愧是我的女朋友,好奇心跟我是一樣樣的,隨我。
那為什么會(huì)出現(xiàn)亂碼呢?
什么是編碼,什么是解碼?
什么是字符碼,什么是字符集?
為什么要有 Unicode ?UTF-8 和 GBK 又有什么不同呢?
三歪坐在我的腿上對(duì)我撒嬌似的說出這一連串的問題,我這個(gè)人寵粉但是更寵女朋友,所以就有了這篇文章。
為什么會(huì)出現(xiàn)亂碼我們知道計(jì)算機(jī)里存儲(chǔ)的只會(huì)是 0 和 1 組成的字節(jié)流,而僅是數(shù)字滿足不了我們的需求,我們還需要文本的處理等等,但是計(jì)算機(jī)只認(rèn)識(shí)數(shù)字,所以我們需要告訴計(jì)算機(jī)什么數(shù)字代表什么字符。
比如我指定 0000 代表 A,0001 代表 B 這樣計(jì)算機(jī)就知道了,所以我要把 AB 這兩個(gè)字符存入計(jì)算機(jī)的話,實(shí)際存儲(chǔ)的就是0000 0001,其實(shí)就等于把每個(gè)字符定制一個(gè)唯一的編碼。
但是這是我的指定,不同的人想法是不同的,比如小明就喜歡 1000 表示 A ,1111 表示 B,那小明的計(jì)算機(jī)按照他指定的編碼方式存儲(chǔ),就是 1000 1111,之后傳輸給我的計(jì)算機(jī),我拿到1000 1111,按照我的編碼解出來可能就是 %& 了,這就亂碼了。
所以亂碼的本質(zhì)就是編碼和解碼實(shí)現(xiàn)沒對(duì)應(yīng)上。
有些同學(xué)可能對(duì)編碼和解碼的概念不太熟悉,我來解釋一下:
編碼:其實(shí)就是將字符按照一定的格式轉(zhuǎn)換成字節(jié)流的過程。
解碼:就是將字節(jié)流解析成字符。
可以看到隨意編碼的就會(huì)產(chǎn)生各自的計(jì)算機(jī)都無法正確解析的情況,所以需要有一個(gè)標(biāo)準(zhǔn),大家都按那個(gè)標(biāo)準(zhǔn)來指定字符和數(shù)字的對(duì)應(yīng)關(guān)系。
標(biāo)準(zhǔn)字符編碼
美國國家標(biāo)準(zhǔn)協(xié)會(huì) ANSI 就制定了一個(gè)標(biāo)準(zhǔn),即美國信息交換標(biāo)準(zhǔn)代碼(ASCII),規(guī)定了常用字符集的集合和對(duì)應(yīng)的數(shù)字編號(hào),例如 65 表示 A。
ASCII 實(shí)際上是 7 位編碼,用二進(jìn)制代碼表示就是 0000000~1111111,不過 1 個(gè)字節(jié)是 8 位,所以一般都用 8 位來存儲(chǔ)??梢钥吹? ASCII 代表了 128 個(gè)字符,這其實(shí)是傾美國的編碼,你看同樣講英文的英國,ASCII 上都沒英鎊的標(biāo)記。
還有人家的韓文,日文等等,更別說咱們中文了。
1 個(gè)字節(jié)最多只能表示 256 個(gè)字符,所以對(duì)我們來說不夠用,因此需要擴(kuò)展,像 GB2312 就是我們國家標(biāo)準(zhǔn)總局發(fā)布的《信息交換用漢字編碼字符集》,后來又發(fā)布了 GBK ,這個(gè) K 就是擴(kuò)展的意思,在 GB2312 的基礎(chǔ)上又添加了很多比如繁體字等字符。
所以說等于每個(gè)國家都有自己的標(biāo)準(zhǔn),因?yàn)檎Z言都是不同的,各字符集的不同就導(dǎo)致計(jì)算機(jī)之間文檔的交流非常困難,因此大家又開始了一波標(biāo)準(zhǔn)化。
像美國的 ANSI 組織制定了 ANSI 標(biāo)準(zhǔn)字符編碼,其實(shí)就是制定平臺(tái)默認(rèn)的編碼,比如中國的操作系統(tǒng)就用 GBK ,如果是美國就用 ASCII,操作系統(tǒng)會(huì)預(yù)裝這些標(biāo)準(zhǔn)字符集。
不過這只能解決一份文檔一份字符編碼的情況,假設(shè)我文檔里面有日語、法語、德語、俄語、中文,你說怎么辦?
Unicode
所以又搞了個(gè) Unicode,又稱統(tǒng)一碼、萬國碼、單一碼。
Unicode 字符集涵蓋了目前人類使用的所有字符,并為每個(gè)字符進(jìn)行統(tǒng)一編號(hào),分配唯一的字符碼,你看這種事情總得有人做,不然就沒法統(tǒng)一。
這里有幾個(gè)術(shù)語我解釋一下,讓大伙更加清晰一些。
字符:其實(shí)就像英文字母,或者我們的中文都叫字符
字符集:那就是字符和編號(hào)對(duì)應(yīng)的集合
字符碼:就是字符集里面字符對(duì)應(yīng)的數(shù)字,或者說編號(hào),比如在 ASCII 字符集里面, A 的字符碼是 65
字符編碼:就是按照字符集中字符和數(shù)字的映射關(guān)系,轉(zhuǎn)化成字節(jié)流的實(shí)現(xiàn)
對(duì)于 Unicode 而言有一點(diǎn)和之前的編碼不太一樣,它將字符集和編碼實(shí)現(xiàn)解耦了。
之前的編碼比如 ASCII 編碼、GBK 編碼等等,它們的字符集和編碼實(shí)現(xiàn)是綁死的,你可以理解成以前的編碼其實(shí)就是查表,有一個(gè)固定的表格里面存儲(chǔ)這字符和對(duì)應(yīng)固定的二進(jìn)制,比如 A 對(duì)應(yīng)的編號(hào)是 65,其二進(jìn)制序列就是 01000001。
而 Unicode 不一樣,它將字符集和字符編碼實(shí)現(xiàn)分開了,比如 A 對(duì)應(yīng)的編號(hào)是 65,但是對(duì)應(yīng)的二進(jìn)制序列就不一定了,得看具體的字符編碼,如果是 UTF-8 編碼,則是 01000001,如果是 UTF-16 編碼(大端),則是 00000000 01000001。
這其實(shí)也是為什么我們現(xiàn)在常用 UTF-8 而不是 UTF-16 的原因,可以看到 UTF-16 編碼存儲(chǔ)效率較低,最少使用兩個(gè)字節(jié),并且像 C 語言的很多函數(shù)都會(huì)將 0x00 字節(jié)作為字符串的停止符來解析,所以才搞了個(gè) UTF-8,其使用 1~4 字節(jié)為每個(gè)字符編碼,是變長的,具體如何編碼的我就不說了,隨便查一下就有。
到此,關(guān)于“為什么idea輸出會(huì)亂碼”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!