【計算機基礎】字符集與字符編碼

在編程過程當中,字符的編碼問題不可避免。以Web應用爲例,HTTP協議中報文頭裏的Accept-Charset、Accept-Encoding、Content-Encoding等就是字符編碼的一種體現。當咱們充分理解字符編碼的原理後,咱們就能夠避免再看到諸如??OY}T??N*NuL?亂碼的狀況。html

基本概念

編碼:把一種信息格式轉換爲另外一種信息格式。對與計算機而言,此過程是把咱們天然世界裏的字符、聲頻、音頻等轉換爲二進制形式。
解碼:編碼的逆過程。
亂碼:不能正確顯示字符的現象,緣由可能是編碼與解碼所用的映射關係不匹配。
字符集:某一系統全部字符的集合。如:中文字符集包括漢字、漢字符號等。
字符編碼:把字符集中的字符編碼成指定集合中的對象。如Unicode編碼、GB2312字符編碼。一般,人們認爲字符集和字符編碼是同義詞(由於特定的字符編碼會有惟一的字符集與之對應)。編程

各國編碼

瞭解了編碼的基本概念以後,咱們須要明確一下,各國是如何對本國字符進行編碼的:
ASCII編碼
因爲計算機是西方國家產物。所以,在計算機被髮明的很長時間內,都是使用一種叫ASCII碼的東西對西方國家經常使用的字符進行編碼。
ASCII使用一個字節存儲字符,且第一位同一爲0,實際只能表示128個字符。對應的碼錶能夠在這個網站查看。
各國獨立編碼
雖然ASCII對於美國等西方國家使用時勉強足夠,可是對非英語系的國家而言,其字符遠遠不知128個,所以,各國紛紛擬定可以容納本國字符的編碼。比方中國的GB2312編碼、日本的ISO2022編碼。
Unicode編碼
各國使用各自的編碼,在本國使用固然不會有問題。若是編碼的對象須要在互聯網上傳輸、共享,仍是會有亂碼的發生。所以,一個懷着「把世界上全部的字符都用同一編碼」偉大夢想的,統一碼聯盟誕生了。這個聯盟擬定的編碼方式如:UTF-32(使用4個字節存儲一個字符);UTF-16(使用2個字節存儲一個字符);UTF-8(使用1-4個字節變長編碼)等實現。
UTF-8編碼
咱們知道UTF-8編碼只是Unicode編碼的一種實現,但在編程中,UTF-8也是最常常使用的。所以,這裏簡單介紹一下UTF-8的編碼策略。
對於UTF-8編碼的字符,第一個字節裏的高x位1表示該字符用x位字節編碼;接下來的x位前兩位必是10。下面的表格簡單模擬了UTF-8編碼過程:jsp

碼點位數 碼點起值 碼點終值 字節序列 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6
7 U+0000 U+007F 1 0xxxxxxx NULL NULL NULL NULL NULL
11 U+0080 U+07FF 2 110xxxxx 10xxxxxx NULL NULL NULL NULL
16 U+0080 U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx NULL NULL NULL
21 U+10000 U+1FFFFF 4 11110xxx 10xxxxx 10xxxxxx 10xxxxxx NULL NULL
26 U+200000 U+3FFFFFF 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx NULL
31 U+4000000 U+7FFFFFFF 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

由上面的表格能夠看出,當高1位爲0時,UTF-8編碼和ASCII編碼一致。網站

編碼應用

在JEE開發過程當中,假定有以下JSP頁面:編碼

<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<%
    out.print("中國");
%>

在這裏:.net

  • pageEncoding:JSP轉換成Servlet時使用的編碼code

  • contentType:獲取printWriter時,使用的編碼htm

二者使用的映射同樣,不會出現亂碼。對象

參考文獻

維基百科|字符編碼
維基百科|UTF-8ip

相關文章
相關標籤/搜索