字符集及其存儲方式(解決亂碼問題)
來自微信公眾號 深度學習自然語言處理
閱讀大概需要4分鐘
在我們進行文本挖掘或處理文檔時,都要面臨一個最最基本的問題->就是解決亂碼問題。在此,介紹最本質的字元編碼。
我們熟悉的有三種:ASCII字符集,中文字符集(GBK),Unicode字符集
ASCII字符集
故事:
美國信息交換標準代碼,這是計算機上最早使用的通用的編碼方案。那個時候計算機還只是拉丁文字的專利,根本沒有想到現在計算機的發展勢頭,如果想到了,可能一開始就會使用unicode了。當時絕大部分專家都認為,要用計算機,必須熟練掌握英文。這種編碼佔用7個Bit,在計算機中佔用一個位元組,8位,最高位沒用,通訊的時候有時用作奇偶校驗位。因此ASCII編碼的取值範圍實際上是:0x00-0x7f,只能表示128個字元。後來發現128個不太夠用,做了擴展,叫做ASCII擴展編碼,用足八位,取值範圍變成:0x00-0xff,能表示256個字元。其實這種擴展意義不大,因為256個字元表示一些非拉丁文字遠遠不夠,但是表示拉丁文字,又用不完。所以擴展的意義還是為了下面的ANSI編碼服務。
- 單位元組存儲
用一個位元組(8位)來表示字元
共2^7=128個字元
字符集:規則的集合
字元 -> 字元對應的二進位數字
存儲方式:
字元對應的二進位數字 -> 實際存儲數值
中文字符集
GBK全稱《漢字內碼擴展規範》(GBK即「國標」、「擴展」漢語拼音的第一個字母,英文名稱:Chinese Internal Code Specification) ,中華人民共和國全國信息技術標準化技術委員會1995年12月1日制訂,國家技術監督局標準化司、電子工業部科技與質量監督司1995年12月15日聯合以技監標函1995 229號文件的形式,將它確定為技術規範指導性文件。這一版的GBK規範為1.0版。
產生原因:ASCII 字符集無法表示中文
GBK等漢字編碼:
多位元組存儲,兼容ASCII, 存儲方式:EUC4-CN
高位為1的位元組,表示其是一個雙位元組二進位碼
Unicode
Unicode(統一碼、萬國碼、單一碼)是計算機科學領域裡的一項業界標準,包括字符集、編碼方案等。Unicode 是為了解決傳統的字元編碼方案的局限而產生的,它為每種語言中的每個字元設定了統一併且唯一的二進位編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。
支持世界上幾乎所有字元的字符集
表示範圍:0000 ~ 10FFFF、 100多萬個符號
存儲方式:UTF-8, UTF-16, UTF-32
UTF-8:
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,又稱萬國碼。由Ken Thompson於1992年創建。現在已經標準化為RFC 3629。UTF-8用1到4個位元組編碼Unicode字元。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
變長存儲: 使用1~4個位元組。
對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
對於n位元組的符號(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位位,全部為這個符號的unicode碼。
很明顯,在C++中為了解決是漢字還是字母的問題上,判斷其二進位首位即可。而java則不用,有直接掃描字元的函數。(還有同學問了,那為啥要用C++...a simple reason 嘛,C++快)
再舉個實例:
OK,回歸主題:亂碼?
例如:UTF-8存儲方式的文件,用GBK方式讀取 or GBK存儲方式的文件,用UTF-8方式讀取 就會產生亂碼
ANSI - Windows中默認的字符集
這個還得了解!
在你在windows 下保存一個文本時,默認的第一個保存方式就是這個東東。
在中文Windows操作系統中:
對於英文文件是ASCII字符集。
對於簡體中文文件是GB2312字符集。
繁體中文版會採用Big5字符集。
在日文Windows操作系統中:
對於英文字元是ASCII字符集。
對於日文字元是Shift_JIS。
不同 ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。
參考潘達師兄ppt
每日托福單詞
consensus n. 一致意見,共識
stereotype n. 思維定勢 v. 刻板地對待
larva n.幼蟲
vague adj. 含糊的,不明確的
saint n. 聖徒,聖人
推薦閱讀:
精彩知識回顧
詳解機器學習之the Learning Problem
詳解依存樹的來龍去脈及用法
TreeLSTM Sentiment Classification
一分鐘搞懂的演算法之BPE演算法
【乾貨】神經網路SRU
基於attention的seq2seq機器翻譯實踐詳解
【乾貨】基於注意力機制的seq2seq網路
【乾貨】GRU神經網路
推薦閱讀: