首页
/
每日頭條
/
科技
/
最常用的字符集編碼方式
最常用的字符集編碼方式
更新时间:2024-10-14 05:18:03
前言

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

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

最常用的字符集編碼方式(為什麼會存在亂碼)1

那為什麼會出現亂碼呢?

什麼是編碼,什麼是解碼?

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

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

三歪坐在我的腿上對我撒嬌似的說出這一連串的問題,我這個人寵粉但是更寵女朋友,所以就有了這篇文章。

最常用的字符集編碼方式(為什麼會存在亂碼)2

為什麼會出現亂碼

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

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

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

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

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

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

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

标準字符編碼

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

最常用的字符集編碼方式(為什麼會存在亂碼)3

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

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

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

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

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

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

最常用的字符集編碼方式(為什麼會存在亂碼)4

Unicode

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

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

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

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

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

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

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

最常用的字符集編碼方式(為什麼會存在亂碼)5

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

最後

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

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

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

本期就是應該算是一期比較有意思的科普系列,但是還是渴求你的點贊哈哈。

絮叨

敖丙把自己的面試文章整理成了一本電子書,共 1630頁!

幹貨滿滿,字字精髓。目錄如下,還有我複習時總結的面試題以及簡曆模闆,現在免費送給大家。

最常用的字符集編碼方式(為什麼會存在亂碼)6

我是敖丙,你知道的越多,你不知道的越多,感謝各位人才的:點贊收藏評論,我們下期見!


文章持續更新,回複【資料】有我準備的一線大廠面試資料和簡曆模闆,,有大廠面試完整考點。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
氨氣洩漏解決方案
氨氣洩漏解決方案
氨氣洩漏解決方案?新安晚報安徽網大皖新聞訊7月14日12時,一企業廠區散發出刺激性惡臭味,初步查明系高溫惹禍緻氨氣制冷系統自動洩壓釋放部分氨氣,接下來我們就來聊聊關于氨氣洩漏解決方案?以下内容大家不妨參考一二希望能幫到您!氨氣洩漏解決方案新...
2024-10-14
dnf被禁三個月
dnf被禁三個月
DNF的600W勇士,你們這麼看待這個篡改客服端的時間點問題,來看看我的經曆。剛剛上号說是去打團進去攻堅隊頻道,我看到右上角一票紅色醒目的紅字,制裁着56個小時,我真醉了,30号那晚我刷深淵到1号,1号淩晨2點才下遊戲都沒制裁,昨天也玩到中...
2024-10-14
鋁門安裝全過程
鋁門安裝全過程
鋁鎂合金門構成和概述鋁鎂合金門鋁闆主要元素是鋁,再摻入少量的鎂、銅、矽、錳、鉻、鋅、鐵等金屬材料來加強其硬度、光澤度、拉伸度。以鎂為主要添加元素的鋁合金,由于它抗蝕性好,又稱防鏽鋁合金。因本身就是金屬,其導熱性能和強度尤為突出。鋁鎂合金門的...
2024-10-14
矩陣切換使用方法
矩陣切換使用方法
視頻矩陣切換器是什麼?在音視頻領域中,視頻矩陣切換器是指支持多路視頻、音頻或者音視頻信号分配成多路輸出并支持根據不同的需求進行切換的音視頻設備。比如以4進4出的HDMI矩陣414HN為例,支持4路HDMI音視頻信号輸入和4路HDMI音視頻信...
2024-10-14
u盤格式化了可以恢複數據嗎
u盤格式化了可以恢複數據嗎
一般我們在完成了一鍵u盤裝系統之後,win7系統就可以正常工作了。不過在使用U盤的時候,可能會不小心将其格式化,導緻一些重要的數據丢失,那麼能不能找回來呢?下面就來看看誤将U盤格式化的常見恢複方法吧。一旦U盤不小心被格式化,不要過于擔心,也...
2024-10-14
Copyright 2023-2024 - www.tftnews.com All Rights Reserved