編碼基礎知識
iso-8859-1
iso-8859-1 的較低部分(從 1 到 127 之間的**)。
iso-8859-1 的較高部分(從 160 到 255 之間的**)。
因此只能表示一些數字,英文本母和西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字元號
單位元組,即乙個位元組對應乙個編碼,不能編碼漢字
gbk
1) 能編碼漢字,乙個漢字用2個位元組編碼
2) 編碼的漢字比gb2312更多
gb2312
能編碼漢字,乙個漢字用2個位元組編碼
utf-8
英文本母用乙個位元組表示,乙個漢字用3個位元組表示
字符集範圍包括:漢字、字母、符號
編碼和解碼
原理
我們平時看到的「美女」是字元,是一種邏輯展示,計算機不會直接儲存乙個這樣的字串,
考慮重用,計算機儲存的基本單位是位元組,然後由位元組來表示字元,比如a用[97]表示
這種對映關係就叫做編碼,因此乙個字串要被編碼成位元組之後才能被計算機儲存,網路傳輸
也是如此,都是以位元組的形式傳輸。
將位元組還原成字元的過程叫做解碼。
那麼就要規定編碼和解碼的規則要相同,否則就會造成亂碼
servlet容器中遇到的編碼問題
接收瀏覽器post請求
客戶端是瀏覽器
服務端是servlet容器
那麼首先,客戶端要指定編碼的方式,以html為例:
html4:
html5:
此標籤的作用不是瀏覽器展示時用的,而是瀏覽發起post請求時,按此編碼將
傳送的內容編碼為位元組。
servlet服務端解碼方式:
request.setcharacterencoding("utf-8");
string name = request.getparameter("name");
接收瀏覽器get請求
如:http://localhost:8888/webtest/encodeservlet?name=你好
瀏覽器將會對url進行urlencode,編碼方式為utf-8
服務端解碼方式:
string name = new string(request.getparameter("name").getbytes("iso-8859-1"),"utf-8");
此處用request.setcharacterencoding("utf-8");來設定解碼,不能奏效,原因是get請求將引數拼在url後面進行url encode,而web容器對url的解碼是在呼叫servlet之前,且預設解碼方式是iso-8859-1
當然這個uri encode的可以修改的,其實中國人開發的程式,就應該講uri的編碼也設定成utf-8而不是iso-8859-1
如果是tomcat,則修改位置如下:
響應給瀏覽器
response設定編碼:
response是指響應給客戶端時,位元組的編碼方式,預設為iso-8859-1
可用如下方法檢視:
response.getcharacterencoding();
設定響應流的編碼方式:
response.setcharacterencoding("utf-8");
設定瀏覽器的解碼方式:
response.setcontenttype("text/html;charset=utf-8");
此設定是告知客戶端按此編碼來解碼
struts2 和spring 設定編碼問題
struts2
struts.xml中做如下配置:
spring
web.xml中配置如下:
encodingfilter org.springframework.web.filter.characterencodingfilter
encoding
utf-8
forceencoding
true
其中encoding設定服務端編碼和解碼的方式
forceencoding表示強制編碼的方式
字串轉位元組轉碼
string s = "s漢";
byte bytes1 = s.getbytes("iso-8859-1");//丟失字元
byte bytes2 = s.getbytes("gbk");
byte bytes3 = s.getbytes("utf-8");
位元組轉字串
string s1 = new string(bytes1,"utf-8");//丟失
string s2 = new string(bytes2,"gbk");
string s3 = new string(bytes3,"utf-8");
VLC 中文路徑轉碼問題
最近用mfc編寫呼叫libvlc的程式時碰到中文路徑不能開啟的問題,憤悶了兩天終於給解決了,在這裡貼出來希望給那些遇到轉碼問題的人一點幫助。主要問題是編碼方式不對,現在程式主要是用unicode碼,我遇到的libvlc預設為utf8,這就在遇到中文是需要轉為utf8。我遇到的主要是cstring轉為...
python轉碼總結
python返回字串中有些是亂碼 如下列情況 第一種情況 此處讀取的是中文路徑下檔案,使用 print s.decode encoding gb2312 errors strict 因為字串編碼是gbk格式,也可寫成decode gbk error strict 截圖是decode方法原始碼解釋,我...
php中文url轉碼例項
php url 編碼 url 可以使用 urlencode 或者 rawurlencode 二者的區別是前者把空格編碼為 而後者把空格編碼為 20 注意,在編碼時應該只對部分url編碼,否則url中的冒號和反斜槓也會被轉義。詳細解釋 string urlencode string str 例子 1....