關於字元編碼的那些事

2021-10-22 04:13:52 字數 1830 閱讀 6113

作為程式設計師,在工作或者學習的過程中肯定遇到字元亂碼的現象。可能是在某個檔案的文字內容**現,又或者是在網路傳輸的過程中遇見。而發生這些問題的原因都和今天要說主角字元編碼有關係。

由於計算機本身不能表述具體的資訊,因此通過規定好的數字對現實生活中的資訊比如英文、中文進行描述,通過這種方式就可以表述具體的資訊。而這種描述資訊的方式就叫做字元編碼。

ascii 由電報碼發展而來,是第一套現代計算機用於資訊交換的標準**,它定義了128個字元。比如97代表的是』a』字元,具體定義的內容可看如下。而ascii使用也比較簡單,對於指定的字元只要通過表查詢到對應的位元組表示,然後以二進位制的方式存進儲存設施中即可。

**於網路

缺點:由於當時的時代原因,預設使用的8個位元組來進行位元組的編碼。這樣導致的結果是128個字元只能描述很有限的資訊。

上述說道字符集表示不夠用的問題,各個廠商針對這個問題想到了臨時相容的方式。由於128個字元只占用了7個位元組就表示完了,因此第一位位元組還有128個數字的空間可以表示。比如ibm pc charset通過後面128定義一些特殊的字元。

缺點: 這種方式只是緩解了字元表示數量不夠的問題,但是還是不能從根本上解決這個問題。並且由於各個廠商對於後面128位的數字定義的規則不盡相同,因此還會出現相容性問題,同乙份文件可能在不同的機器上會有不同的顯示效果。

對於歐美國家來說,單位元組可能已經足夠表示所有的字元。但是對於很多亞洲國家來說(比如中國)字元可能是數以萬計的。因此單位元組並不能滿足需求。中國就此制定了像gb2312(記錄了所有的簡體字)、gbk(gb2312的擴充套件加上了繁體字以及一些特殊字元)的雙位元組字符集。

這種字符集的使用方式會涉及到多張字符集表,比如gbk,會通過第乙個位元組來判斷具體查詢哪張碼表,比如0x81這個數字,由於首位位元組是1,那就需要檢視另一張專門記錄中文字符集的表,找到對應的字元,如果首位位元組是0那麼和ascii表表述一致。通過這種方式可以記錄的字元數量則大大增加了。

雖然多位元組字符集解決了各自語言編碼的問題,但是針對世界上所有的語言卻沒有乙個統一的字符集來描述。因此在2023年10月unicode組織發布了第一版unicode字符集。該字符集涵蓋了當前世界上所有的字元。

需要注意的是,unicode還有乙個比較大的變化就是將字元和位元組流編碼進行了解耦,在此之前比如ascii字符集,通過查詢表可以直接獲取到對應的而二進位製流編碼(如下圖),這種方式的問題在於如果新加入了不同編碼方式的字符集,然後二進位製流的編碼方式已經固定不能更換,因此unicode這種方式極大的提高了擴充套件性。比如utf-8和ut-16兩種不同的編碼方式針對同一字元會有不同的結果。

需要注意的是我們常說的用什麼編碼方式進行編碼,通常可以指gbk,utf-8,ascii等。但是不能說unicode因為它只是定義了字元的二進位製碼,但是具體的編碼方式並沒有定義。

文章開頭所說的亂碼現在應該可以很好理解,通常是因為沒有指定字元編碼或者使用了錯誤的字元編碼來解析導致出現亂碼的情況。所以平常的開發過程中需要時刻注意文字使用的編碼方式是什麼,或者在響應**輸出流的時候有沒有指定到具體的編碼方式。

最後做個總結,本文主要通過字元編碼的發展歷程講了不同的字元編碼方式,從最簡單的ascii編碼,擴充套件的oem字符集,再到不同國家指定的字元編碼(比如中國的gbk編碼方式),最後發展出unicode編碼集,並且有了utf-8、utf-16等具體的編碼方式,希望大家看了這篇文章對字元編碼有乙個更加深刻的理解。

聊聊字元編碼那些事

計算機字元編碼的歷史 在windows作業系統下可以通過命令列模式檢視系統使用的字符集,如下圖所示 從圖中看到,活動頁 為936,代表gb2312 簡體中文 作者的個人計算機安裝的是windows10簡體中文版。microsoft visual studio整合開發環境採用的字元編碼是作業系統使用的...

python編碼的那些事

字串編碼在python裡是經常會遇到的問題,特別是寫檔案或是網路傳輸呼叫某些函式的時候.現在來看看python中的unicode編碼和utf 8編碼 字串編碼的歷史 計算機只能處理數字,文字轉換為數字才能處理.計算機中8個bit作為乙個位元組,所以乙個位元組能表示最大的數字為255 計算機是美國人發...

關於開始的那些事

人總是有惰性的,當然我自己深有體會。一直有個想法想寫寫自己的blog,但隨時間的推移,很久都沒付出行動。最近工作專案開始不那麼忙了,維護乙份自己的blog的想法愈發強烈了。想把自己的一些想法,或者看到的一些有用的東西給大家分享,也給自己留下成長的痕跡。我從小喜歡看書,各種各樣的書屬於不求甚解的狀態。...