余江平+王偉
【摘 要】 用戶在瀏覽網頁和進行協(xié)議分析的過程中,經常會遇到出現(xiàn)亂碼的情況,亂碼問題阻礙了正常工作。本文首先闡述了字符集和字符編碼的基本原理,接下來介紹了審計系統(tǒng)里面協(xié)議分析、報表生成等行為中亂碼產生的原因,接下來介紹了消除亂碼的辦法。
【關鍵詞】 字符編碼 字符集 審計系統(tǒng) 亂碼
1 引言
計算機中數據信息可分為數值和非數值信息。非數值信息包括了字母、各種控制符號、圖形符號等,它們都以二進制編碼方式存入計算機并得以處理。我們在屏幕上看到的英文、漢字等字符是二進制數轉換之后的結果。通俗的說,按照何種規(guī)則將各種字符集文字存儲在計算機中,如'a'用什么表示,“你好”用什么表示,稱為"編碼";反之,將存儲在計算機中的二進制數解析顯示出來,稱為"解碼",如果使用了錯誤的解碼規(guī)則,則可能導致亂碼。
2 字符集和字符編碼
2.1 概念
首先介紹相關概念。字符,即抽象意義上的一個符號。例如'1', '我', 'a', ‘%,'$', '¥', 。。。。字節(jié),即計算機中的數據的存儲單元,是一個8位的二進制數。 例如0x01, 0x12,。。。。字符集,即多個字符的集合,而這些字符可能是各國家文字、標點符號、圖形符號、數字等。字符編碼:規(guī)定每個“字符”分別用一個字節(jié)還是多個字節(jié)存儲,用哪些字節(jié)什么形式來存儲。
編碼(encoding)和字符集不同。字符集只是字符的集合,不一定適合作網絡傳送、處理,有時須經編碼(encode)后才能應用如Unicode可依不同需要以UTF-8、UTF-16、UTF-32等方式編碼。
2.2 常見的字符集合對應字符編碼
常見字符集名稱:ASCII字符集、Unicode字符集等。計算機要準確的處理各種字符集文字,需要進行字符編碼,以便計算機能夠識別和存儲各種文字。
2.2.1 ASCII字符集與ASCII編碼
ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)它主要用于顯示現(xiàn)代英語,它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)。
ASCII編碼:將ASCII字符集轉換為計算機可以接受的數字系統(tǒng)的數的規(guī)則。使用7位(bits)表示一個字符,共128字符;但是7位編碼的字符集只能支持128個字符為了表示更多的常用字符對ASCII進行了擴展,ASCII擴展字符集使用8位(bits)表示一個字符,共256字符 詳細可以查詢ASCII字符代碼表,其缺點是只能顯示現(xiàn)代英語單字節(jié)字符,一個字節(jié)(8位)存放一個字符。
2.2.2 GB2312等字符集和ANSI編碼
為使計算機支持更多語言,通常使用0x800~xFF范圍的2個字節(jié)來表示1個字符。比如漢字'中'在中文OS中,使用[0xD6,0xD0]這兩個字節(jié)存儲。
不同的國家和地區(qū)制定了不同的標準,由此產生了GB2312,BIG5,JIS等各自的編碼標準。這些使用2個字節(jié)來代表一個字符的各種漢字延伸編碼方式,稱為ANSI編碼。在簡體中文系統(tǒng)下,ANSI 編碼代表GB2312編碼,在日文操作系統(tǒng)下,ANSI編碼代表JIS編碼。
2.2.3 UNICODE字符集和utf-8 utf-16UTF-32編碼
計算機存放字符串時,改為存放每個字符在UNICODE字符集中的序號。目前計算機一般使用2個字節(jié)(16位)來存放一個序號(DBCS),因此,這種方式存放的字符也被稱作寬字節(jié)字符。例如"中文123"占五個序號,10個字節(jié)
我們知道,ASCII字符是單個字節(jié)的,比如“A”的ASCII是65。而Unicode是雙字節(jié)的,比如“A”的Unicode是0065,這就造成了一個非常大的問題:以前處理ASCII的那套機制不能被用來處理Unicode了。
另一個更加嚴重的問題是,C語言使用'\0'作為字符串結尾,而Unicode里恰恰有很多字符都有一個字節(jié)為0,這樣一來,C語言的字符串函數將無法正常處理Unicode,所以就產生了UTF,UTF= UCS Transformation Format,即UCS轉換(傳輸)格式。它是將Unicode編碼規(guī)則和計算機的實際編碼對應起來的一個規(guī)則?,F(xiàn)在流行的UTF有2種:UTF-8和UTF-16,都是Unicode的編碼實現(xiàn)。
UTF-8兼容ASCII。UTF-8是變長的,將Unicode編碼為00000000-0000007F的字符,用單個字節(jié)來表示;00000080-000007FF的字符用兩個字節(jié)表示;00000800-0000FFFF的字符用3字節(jié)表示,Utf-16不兼容ASCII。
3 產生亂碼的可能原因以及解決方法
(1)取文本文件時,如果將“字節(jié)串”簡單地作為單字節(jié)字符串,采用每“一個字節(jié)”就是“一個字符”的方法進行轉化 那可能就會出現(xiàn)亂碼。
解決方法:應該將“字節(jié)串”作為ANSI字符串,采用適當的編碼來得到UNICODE字符串,有可能“多個字節(jié)”才能得到“一個字符”。
(2)協(xié)議分析過程中,例如http中與字符集和字符編碼相關的消息頭是Accept-Charset:瀏覽器申明自己接收的字符集和字符編碼如gb2312,utf-8。Content-Type:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集。例如:Content-Type:text/html;charset='gb2312',所以是根據這兩個進行編碼轉換的。
(3)抓取數據包時候可能遇到的編碼。URL編碼:URL編碼遵循每對name/value,由&;符分每對來自表單的name/value由=符分開任何特殊的字符。Base64編碼:Base64是網絡上最常見的用于傳輸8Bit字節(jié)編碼的編碼方式之一,Base64編碼可用于在HTTP環(huán)境下傳遞較長的標識信息,在Xml格式文件明顯有使用到。
4 結語
本文闡述了字符集和字符編碼的基本原理,介紹了審計系統(tǒng)里面協(xié)議分析、報表生成等行為中亂碼產生的原因,介紹了消除亂碼的辦法。
參考文獻:
[1]徐新華.字符編碼詳解. http://polaris.blog.51cto.com/1146394/377468
[2]吳秦.字符集和字符編碼. http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
[3]字符,字節(jié)和編碼. http://www.regexlab.com/zh/encoding.htmendprint