在編程過程當中,字符的編碼問題不可避免。以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
二者使用的映射同樣,不會出現亂碼。對象