字符集及其存儲方式(解決亂碼問題)

來自微信公眾號 深度學習自然語言處理

閱讀大概需要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神經網路


推薦閱讀:

字元編碼(四)|python2中的編碼問題

TAG:自然語言處理 | 亂碼 | 字元編碼 |