自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

女朋友問(wèn)我:為什么會(huì)亂碼?

開發(fā) 前端
亂碼這個(gè)東西相信大家都遇到過(guò),今天我的女朋友三歪就火急火燎的上來(lái)找我:“親愛(ài)的,我的idea怎么輸出亂碼了?”

[[346406]]

本文轉(zhuǎn)載自微信公眾號(hào)「三太子敖丙」,作者三太子敖丙 。轉(zhuǎn)載本文請(qǐng)聯(lián)系三太子敖丙公眾號(hào)。

 前言

亂碼這個(gè)東西相信大家都遇到過(guò),今天我的女朋友三歪就火急火燎的上來(lái)找我:“親愛(ài)的,我的idea怎么輸出亂碼了?”

我一頓操作就給他搞好了,但是三歪不愧是我的女朋友,好奇心跟我是一樣樣的,隨我。

 

那為什么會(huì)出現(xiàn)亂碼呢?

什么是編碼,什么是解碼?

什么是字符碼,什么是字符集?

為什么要有 Unicode ?UTF-8 和 GBK 又有什么不同呢?

三歪坐在我的腿上對(duì)我撒嬌似的說(shuō)出這一連串的問(wèn)題,我這個(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,按照我的編碼解出來(lái)可能就是 %& 了,這就亂碼了。

所以亂碼的本質(zhì)就是編碼和解碼實(shí)現(xiàn)沒(méi)對(duì)應(yīng)上。

有些同學(xué)可能對(duì)編碼和解碼的概念不太熟悉,我來(lái)解釋一下:

  • 編碼:其實(shí)就是將字符按照一定的格式轉(zhuǎn)換成字節(jié)流的過(guò)程。
  • 解碼:就是將字節(jié)流解析成字符。

可以看到隨意編碼的就會(huì)產(chǎn)生各自的計(jì)算機(jī)都無(wú)法正確解析的情況,所以需要有一個(gè)標(biāo)準(zhǔn),大家都按那個(gè)標(biāo)準(zhǔn)來(lái)指定字符和數(shù)字的對(duì)應(yīng)關(guān)系。

標(biāo)準(zhǔn)字符編碼

美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì) ANSI 就制定了一個(gè)標(biāo)準(zhǔn),即美國(guó)信息交換標(biāo)準(zhǔn)代碼(ASCII),規(guī)定了常用字符集的集合和對(duì)應(yīng)的數(shù)字編號(hào),例如 65 表示 A。

 

ASCII 實(shí)際上是 7 位編碼,用二進(jìn)制代碼表示就是 0000000~1111111,不過(guò) 1 個(gè)字節(jié)是 8 位,所以一般都用 8 位來(lái)存儲(chǔ)。可以看到 ASCII 代表了 128 個(gè)字符,這其實(shí)是傾美國(guó)的編碼,你看同樣講英文的英國(guó),ASCII 上都沒(méi)英鎊的標(biāo)記。

還有人家的韓文,日文等等,更別說(shuō)咱們中文了。

1 個(gè)字節(jié)最多只能表示 256 個(gè)字符,所以對(duì)我們來(lái)說(shuō)不夠用,因此需要擴(kuò)展,像 GB2312 就是我們國(guó)家標(biāo)準(zhǔn)總局發(fā)布的《信息交換用漢字編碼字符集》,后來(lái)又發(fā)布了 GBK ,這個(gè) K 就是擴(kuò)展的意思,在 GB2312 的基礎(chǔ)上又添加了很多比如繁體字等字符。

所以說(shuō)等于每個(gè)國(guó)家都有自己的標(biāo)準(zhǔn),因?yàn)檎Z(yǔ)言都是不同的,各字符集的不同就導(dǎo)致計(jì)算機(jī)之間文檔的交流非常困難,因此大家又開始了一波標(biāo)準(zhǔn)化。

像美國(guó)的 ANSI 組織制定了 ANSI 標(biāo)準(zhǔn)字符編碼,其實(shí)就是制定平臺(tái)默認(rèn)的編碼,比如中國(guó)的操作系統(tǒng)就用 GBK ,如果是美國(guó)就用 ASCII,操作系統(tǒng)會(huì)預(yù)裝這些標(biāo)準(zhǔn)字符集。

不過(guò)這只能解決一份文檔一份字符編碼的情況,假設(shè)我文檔里面有日語(yǔ)、法語(yǔ)、德語(yǔ)、俄語(yǔ)、中文,你說(shuō)怎么辦?

Unicode

所以又搞了個(gè) Unicode,又稱統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼。

Unicode 字符集涵蓋了目前人類使用的所有字符,并為每個(gè)字符進(jìn)行統(tǒng)一編號(hào),分配唯一的字符碼,你看這種事情總得有人做,不然就沒(méi)法統(tǒng)一。

這里有幾個(gè)術(shù)語(yǔ)我解釋一下,讓大伙更加清晰一些。

  • 字符:其實(shí)就像英文字母,或者我們的中文都叫字符
  • 字符集:那就是字符和編號(hào)對(duì)應(yīng)的集合
  • 字符碼:就是字符集里面字符對(duì)應(yīng)的數(shù)字,或者說(shuō)編號(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 語(yǔ)言的很多函數(shù)都會(huì)將 0x00 字節(jié)作為字符串的停止符來(lái)解析,所以才搞了個(gè) UTF-8,其使用 1~4 字節(jié)為每個(gè)字符編碼,是變長(zhǎng)的,具體如何編碼的我就不說(shuō)了,隨便查一下就有。

最后

至此我們已經(jīng)清晰了亂碼的根源,也知曉了為什么會(huì)有那么多字符編碼的出現(xiàn),畢竟語(yǔ)言多,一開始出了個(gè) ASCII,但是對(duì)于其他國(guó)家來(lái)說(shuō)不夠用,于是都各自進(jìn)行了擴(kuò)展。

而編碼多了各個(gè)國(guó)家之間難以做到統(tǒng)一,不易兼容,所以后來(lái)國(guó)際組織制定搞了個(gè) Unicode 字符集,對(duì)所有字符做了統(tǒng)一的編排,并且為了使得編碼更加靈活把字符集和編碼實(shí)現(xiàn)分開來(lái)。

對(duì)了,為什么英文都不會(huì)出現(xiàn)亂碼就是因?yàn)榻^大部分的字符集都是基于 ASCII 擴(kuò)展的,所以都兼容 ASCII 。

本期就是應(yīng)該算是一期比較有意思的科普系列,但是還是渴求你的點(diǎn)贊哈哈。

 

責(zé)任編輯:武曉燕 來(lái)源: 三太子敖丙
相關(guān)推薦

2020-03-18 09:31:47

設(shè)計(jì)模式軟件

2020-12-14 10:25:08

DNS通信IP

2021-12-17 17:52:02

MySQL B+面試

2021-04-06 06:23:18

MVCC并發(fā)事務(wù)

2020-09-08 08:55:52

Dubbo服務(wù)全鏈路

2021-09-04 07:56:44

單例模式寫法

2021-06-07 12:11:20

JavaRunning狀態(tài)

2017-10-19 12:45:07

PHP

2019-11-04 10:14:35

區(qū)塊鏈幣圈鏈圈

2020-03-16 14:08:59

線程熔斷限流

2015-08-26 10:17:29

程序員女朋友

2020-09-08 08:57:30

區(qū)塊鏈

2021-09-06 08:50:49

服務(wù)Dubbo參數(shù)

2021-03-02 06:03:30

Java繼承對(duì)象

2021-09-14 12:00:11

VR字節(jié)跳動(dòng)

2019-10-09 10:45:16

云計(jì)算Web互聯(lián)網(wǎng)

2020-12-04 09:11:50

CTOAPI網(wǎng)關(guān)

2020-10-19 13:01:31

刪庫(kù)程序員思科

2021-05-20 10:27:26

數(shù)據(jù)爬取頁(yè)面

2020-12-28 06:11:24

羊群效應(yīng)zookeeper
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)