成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么會存在亂碼?什么是編解碼?為什么會有這么多字符集?

開發 前端
我們知道計算機里存儲的只會是 0 和 1 組成的字節流,而僅是數字滿足不了我們的需求,我們還需要文本的處理等等,但是計算機只認識數字,所以我們需要告訴計算機什么數字代表什么字符。

[[346475]]

前言
亂碼這個東西相信大家都遇到過,今天我的女朋友三歪就火急火燎的上來找我:“親愛的,我的idea怎么輸出亂碼了?”

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

那為什么會出現亂碼呢?

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

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

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

為什么會出現亂碼
我們知道計算機里存儲的只會是 0 和 1 組成的字節流,而僅是數字滿足不了我們的需求,我們還需要文本的處理等等,但是計算機只認識數字,所以我們需要告訴計算機什么數字代表什么字符。

比如我指定 0000 代表 A,0001 代表 B 這樣計算機就知道了,所以我要把 AB 這兩個字符存入計算機的話,實際存儲的就是0000 0001,其實就等于把每個字符定制一個唯一的編碼。

但是這是我的指定,不同的人想法是不同的,比如小明就喜歡 1000 表示 A ,1111 表示 B,那小明的計算機按照他指定的編碼方式存儲,就是 1000 1111,之后傳輸給我的計算機,我拿到1000 1111,按照我的編碼解出來可能就是 %& 了,這就亂碼了。

所以亂碼的本質就是編碼和解碼實現沒對應上。

有些同學可能對編碼和解碼的概念不太熟悉,我來解釋一下:

  • 編碼:其實就是將字符按照一定的格式轉換成字節流的過程。
  • 解碼:就是將字節流解析成字符。

可以看到隨意編碼的就會產生各自的計算機都無法正確解析的情況,所以需要有一個標準,大家都按那個標準來指定字符和數字的對應關系。

標準字符編碼
美國國家標準協會 ANSI 就制定了一個標準,即美國信息交換標準代碼(ASCII),規定了常用字符集的集合和對應的數字編號,例如 65 表示 A。

ASCII 實際上是 7 位編碼,用二進制代碼表示就是 0000000~1111111,不過 1 個字節是 8 位,所以一般都用 8 位來存儲??梢钥吹?ASCII 代表了 128 個字符,這其實是傾美國的編碼,你看同樣講英文的英國,ASCII 上都沒英鎊的標記。

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

1 個字節最多只能表示 256 個字符,所以對我們來說不夠用,因此需要擴展,像 GB2312 就是我們國家標準總局發布的《信息交換用漢字編碼字符集》,后來又發布了 GBK ,這個 K 就是擴展的意思,在 GB2312 的基礎上又添加了很多比如繁體字等字符。

所以說等于每個國家都有自己的標準,因為語言都是不同的,各字符集的不同就導致計算機之間文檔的交流非常困難,因此大家又開始了一波標準化。

像美國的 ANSI 組織制定了 ANSI 標準字符編碼,其實就是制定平臺默認的編碼,比如中國的操作系統就用 GBK ,如果是美國就用 ASCII,操作系統會預裝這些標準字符集。

不過這只能解決一份文檔一份字符編碼的情況,假設我文檔里面有日語、法語、德語、俄語、中文,你說怎么辦?

Unicode
所以又搞了個 Unicode,又稱統一碼、萬國碼、單一碼。

Unicode 字符集涵蓋了目前人類使用的所有字符,并為每個字符進行統一編號,分配唯一的字符碼,你看這種事情總得有人做,不然就沒法統一。

這里有幾個術語我解釋一下,讓大伙更加清晰一些。

  • 字符:其實就像英文字母,或者我們的中文都叫字符
  • 字符集:那就是字符和編號對應的集合
  • 字符碼:就是字符集里面字符對應的數字,或者說編號,比如在 ASCII 字符集里面, A 的字符碼是 65
  • 字符編碼:就是按照字符集中字符和數字的映射關系,轉化成字節流的實現

對于 Unicode 而言有一點和之前的編碼不太一樣,它將字符集和編碼實現解耦了。

之前的編碼比如 ASCII 編碼、GBK 編碼等等,它們的字符集和編碼實現是綁死的,你可以理解成以前的編碼其實就是查表,有一個固定的表格里面存儲這字符和對應固定的二進制,比如 A 對應的編號是 65,其二進制序列就是 01000001。

而 Unicode 不一樣,它將字符集和字符編碼實現分開了,比如 A 對應的編號是 65,但是對應的二進制序列就不一定了,得看具體的字符編碼,如果是 UTF-8 編碼,則是 01000001,如果是 UTF-16 編碼(大端),則是 00000000 01000001。

這其實也是為什么我們現在常用 UTF-8 而不是 UTF-16 的原因,可以看到 UTF-16 編碼存儲效率較低,最少使用兩個字節,并且像 C 語言的很多函數都會將 0x00 字節作為字符串的停止符來解析,所以才搞了個 UTF-8,其使用 1~4 字節為每個字符編碼,是變長的,具體如何編碼的我就不說了,隨便查一下就有。

最后
至此我們已經清晰了亂碼的根源,也知曉了為什么會有那么多字符編碼的出現,畢竟語言多,一開始出了個 ASCII,但是對于其他國家來說不夠用,于是都各自進行了擴展。

而編碼多了各個國家之間難以做到統一,不易兼容,所以后來國際組織制定搞了個 Unicode 字符集,對所有字符做了統一的編排,并且為了使得編碼更加靈活把字符集和編碼實現分開來。

對了,為什么英文都不會出現亂碼就是因為絕大部分的字符集都是基于 ASCII 擴展的,所以都兼容 ASCII 。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-07-26 23:43:29

編程語言開發Java

2017-12-21 19:38:50

潤乾中間表

2013-01-15 09:41:45

編程語言

2013-01-24 09:44:44

數據庫

2015-05-18 15:08:08

多種程序設計語言程序設計語言

2021-08-19 06:53:18

開發語言Java

2022-08-04 23:32:38

比特幣以太坊代幣

2010-09-02 14:36:44

Linux命令行

2022-01-12 20:04:09

網絡故障斷網事件網絡安全

2014-07-24 09:50:55

Unix開源系統

2020-05-06 16:47:59

ServerlessMVC架構

2022-06-27 16:12:48

CSS像素前端

2020-07-02 14:12:52

C++語言編程

2024-02-04 10:29:58

線程通信

2020-01-02 10:06:16

Java 8Java 14

2021-05-31 22:26:20

5G技術通信

2015-01-14 14:27:18

Docker容器鏡像

2019-01-31 10:15:14

群聊單聊消息

2024-03-01 17:01:15

GraphQL后端

2017-03-09 11:15:18

LinuxRoot賬戶
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产三区四区 | 亚洲人成人一区二区在线观看 | 福利网站在线观看 | 伊人手机在线视频 | 久久亚洲一区 | 亚洲黄色av | av天天爽 | 国产精品99久久久精品免费观看 | 狠狠综合久久av一区二区小说 | 五月婷婷丁香 | www.天堂av.com | 91亚洲国产亚洲国产 | 亚洲高清在线 | 久久久一区二区三区四区 | 欧美成人精品一区二区男人看 | 成人影 | 国产成人一区二区三区电影 | 国产成人精品一区二区三区在线观看 | 欧美综合视频 | 日韩欧美亚洲 | 亚洲永久精品国产 | 日韩免费电影 | av在线三级 | 精品欧美一区二区三区久久久 | 一区欧美 | 久久一 | 色黄网站| 亚洲av毛片成人精品 | 免费在线一区二区 | 日本视频中文字幕 | 国产日韩欧美电影 | 欧美一区2区三区4区公司 | www国产精品 | 国产91丝袜在线熟 | 欧美精品久久 | 无码一区二区三区视频 | 欧美色综合一区二区三区 | 天天操精品视频 | 99精品一区二区三区 | 欧美综合在线观看 | 久久久成人一区二区免费影院 |