關於JAVA字符編碼:Unicode,ISO-8859-1,GBK,UTF-8編碼及相互轉換


轉載:https://www.cnblogs.com/haimishasha/p/6117968.html

目錄

1.1. ISO-8859-1 通常叫做Latin-1
1.2. GB2312/GBK 
1.3 unicode 
1.4 UTF 
2.1 Unicode與各編碼之間的直接轉換
2.2 Unicode與各編碼之間的交叉轉換
2.3 編碼過程中錯誤診斷參考
3.1 getBytes(charset) 
3.2 new String(charset) 
3.3 setCharacterEncoding() 
3.4. 處理過程
3.4.1. 表單輸入
3.4.2. 文件編譯
3.5. javaEE幾處設置
3.5.1. jsp編譯
3.5.2. jsp輸出
3.5.3. meta設置
3.5.4. form設置
3.5.5. JSP頁面獲取表單的值
4.1. MySQL數據庫
4.2. apache
4.3. linux默認編碼
4.4. 其它
5.1. URL編碼
5.2. rewrite
5.3. URLEncode.encode()
6.1. SecureCRT
6.2. 過濾器
6.3. POST和GET
6.4. 簡繁體編碼轉換

我們最初學習計算機的時候,都學過ASCII編碼。

但是為了表示各種各樣的語言,在計算機技術的發展過程中,逐漸出現了很多不同標准的編碼格式,

重要的有Unicode、UTF、ISO-8859-1和中國人經常使用的GB2312、BIG5、GBK等。

1.編碼基礎知識  

       最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現了很多標准編碼,重要的有如下幾個。

   

1.1. ISO-8859-1 通常叫做Latin-1

      屬於單字節編碼,最多能表示的字符范圍是0-255,應用於英文系列。比如,字母a的編碼為0x61=97。 

      很明顯,iso8859-1編碼表示的字符范圍很窄,無法表示中文字符。但是,由於是單字節編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用iso8859-1編碼來表示。

  而且在很多協議上,默認使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,

  以gb2312編碼為例,應該是"d6d0 cec4"兩個字符(java字符占2個字節),

  使用iso8859-1編碼的時候則將它拆開為4個字節來表示:"d6 d0 ce c4"(事實上,在進行存儲的時候,也是以字節為單位處理的)。

  而如果是UTF編碼,則是6個字節"e4 b8 ad e6 96 87"。

  很明顯,這種表示方法還需要以另一種編碼為基礎。 

1.2. GB2312/GBK 

       這就是漢字的國標碼,專門用來表示漢字,是雙字節編碼,而英文字母和iso8859-1一致(兼容iso8859-1編碼)。

  其中gbk編碼能夠用來同時表示繁體字和簡體字,

  而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。 

1.3 unicode 

      這是最統一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(也有四字節的)編碼,包括英文字母在內。所以可以說它是不兼容iso8859-1編碼的,也不兼容任何編碼。不過,相對於iso8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節,比如字母a為"00 61"。 

      需要說明的是,定長編碼便於計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內部是使用unicode編碼來處理的,比如java。 

1.4 UTF 

       考慮到unicode編碼不兼容iso8859-1編碼,而且容易占用更多的空間:因為對於英文字母,unicode也需要兩個字節來表示。所以unicode不便於傳輸和存儲。因此而產生了utf編碼,utf編碼兼容iso8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個字節表示,而漢字使用三個字節。 

       注意,雖然說utf是為了使用更少的空間而使用的,但那只是相對於unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節,但即使對於漢字網頁,utf編碼也會比unicode編碼節省,因為網頁中包含了很多的英文字符。 

2.Unicode、UTF-8 和 ISO8859-1區別與聯系

       將以"中文"兩個字為例,經查表可以知道其

  GB2312編碼是"d6d0 cec4",

  Unicode編碼為"4e2d 6587",

  UTF編碼就是"e4b8ad e69687"。

  注意,這兩個字沒有iso8859-1編碼,但可以用iso8859-1編碼來表示。 

2.1 Unicode與各編碼之間的直接轉換

  下面以對中文字符串"a中文"的編碼轉換為例,來了解各種編碼之間的轉換

  1)Unicode和GBK

  測試結果如下,每個漢字轉換為兩個字節,且是可逆的,即通過字節可以轉換回字符串

String-GBK〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4  
ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u4E2D/u6587(a中文)

  2)Unicode和UTF-8
  測試結果如下,每個漢字轉換為三個字節,且是可逆的,即通過字節可以轉換回字符串

String-UTF-8〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87  
ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u4E2D/u6587(a中文) 

  3)Unicode和ISO-8859-1
  測試結果如下,當存在漢字時轉換失敗,非可逆,即通過字節不能再轉換回字符串

String-ISO-8859-1〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0x3F 0x3F  
ByteArray-ISO-8859-1〉String:0x61 0x3F 0x3F-〉/u0061/u003F/u003F(a??) 

2.2 Unicode與各編碼之間的交叉轉換

  在上面直接轉換中,由字符串(Unicode)生成的字節數組,在構造回字符串時,使用的是正確的編碼集合,如果使用的不是正確的編碼集合會怎樣呢?會正確構造嗎?如果不能正確構造能有辦法恢復嗎?會信息丟失嗎?
  下面我們就來看看這種情況,這部分可以說明在某些情況下雖然我們最終正確顯示了結果,但其間仍然進行了不正確的轉換。

  1)能夠正確顯示的中間不正確轉換

  我們知道String-GBK〉ByteArray-GBK〉String是正確的,但如果我們采用String-GBK〉

ByteArray-ISO-8859-1〉String呢?通過測試結果如下:  

String-GBK〉ByteArray-ISO-8859-1〉String:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u00D6/u00D0/u00CE/u00C4(a????


  這時我們得到的字符串為?亂碼“a????”,但是通過繼續轉換我們仍然可以復原回正確的字符串“a中文”,過程如下:

String-GBK〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-GBK〉String  

對應:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u00D6/u00D0/u00CE/u00C4(a????)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u4E2D/u6587(a中文) 


  也就是我們在首次構造字符串時,我們用了錯誤的編碼集合得到了錯誤的亂碼,但是我們通過錯上加錯,再用錯誤的編碼集合獲取字節數組,然后再用正確的編碼集合構造,就  又恢復了正確的字符串。這時就屬於是“能夠正確顯示的中間不正確轉換”。在Jsp頁面提交數據處理時常常發生這種情況。
  此外能夠正確顯示的中間不正確轉換還有:

String-UTF-8〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-UTF-8〉String 

String-UTF-8〉ByteArray-GBK〉String-GBK〉ByteArray-UTF-8〉String  

對應:/u0061/u4E2D/u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u6D93/uE15F/u6783(a涓枃)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u4E2D/u6587(a中文) 

2.3 編碼過程中錯誤診斷參考

1)一個漢字對應一個問號
  在通過ISO-8859-1從字符串獲取字節數組時,由於一個Unicode轉換成一個byte,當遇到不認識的Unicode時,轉換為0x3F,這樣無論用哪種編碼構造時都會產生一個?亂碼。
2)一個漢字對應兩個問號
  在通過GBK從字符串獲取字節數組時,由於一個Unicode轉換成兩個byte,如果此時用ISO-8859-1或用UTF-8構造字符串就會出現兩個問號。
  若是通過ISO-8859-1構造可以再通過上面所說的錯上加錯恢復(即再通過從ISO-8859-1解析,用GBK構造);
  若是通過UTF-8構造則會產生Unicode字符"/uFFFD",不能恢復,若再通過String-UTF-8〉ByteArray-GBK〉String,則會出現雜碼,如a錕斤拷錕斤拷
3)一個漢字對應三個問號
  在通過UTF-8從字符串獲取字節數組時,由於一個
  這是java字符串處理的一個標准函數,其作用是將字符串所表示的字符按照charset編碼,並以字節方式表示。注意字符串在java內存中總是按unicode編碼存儲的。比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節"d6 d0 ce c4".如果charset為"utf8"則最后是"e4 b8 ad e6 96 87".如果是"iso8859-1",則由於無法編碼,最后返回 "3f 3f"(兩個問號)。

3. java對字符的處理 

在java應用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設置,有些地方需要進行一定程度的處理。 

3.1 getBytes(charset) 

       這是java字符串處理的一個標准函數,其作用是將字符串所表示的字符按照charset編碼,並以字節方式表示。

  注意字符串在java內存中總是按unicode編碼存儲的。

  比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",

如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節"d6 d0 ce c4"。

如果charset為"utf8"則最后是"e4 b8 ad e6 96 87"。

如果是"iso8859-1",則由於無法編碼,最后返回 "3f 3f"(兩個問號)。 

3.2 new String(charset) 

        這是java字符串處理的另一個標准函數,和上一個函數的作用相反,將字節數組按照charset編碼進行組合識別,最后轉換為unicode存儲。

   參考上述getBytes的例子,"gbk" 和"utf8"都可以得出正確的結果"4e2d 6587",但iso8859-1最后變成了"003f 003f"(兩個問號)。

  因為utf8可以用來表示/編碼所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。 

3.3 setCharacterEncoding() 

   該函數用來設置http請求或者相應的編碼。 

       對於request,是指提交內容的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認使用iso8859-1編碼,需要進一步處理。

      參見下述"表單輸入"。值得注意的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。

  java doc上說明:This method must be called prior to reading request parameters or reading input using getReader()。

  該指定只對POST方法有效,對GET方法無效。分析原因:

  POST方法在執行第一個getParameter()的時候,java將會按照編碼分析所有的提交內容,而后續的getParameter()不再進行分析,所以setCharacterEncoding()無效。

  GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析所有的提交內容,setCharacterEncoding()自然就無效。

       注意:iso-8859-1是JAVA網絡傳輸使用的標准字符集,而gb2312是標准中文字符集,當你作出提交表單等需要網絡傳輸的操作的時候,就需要把 iso-8859-1轉換為gb2312字符集顯示,否則如果按瀏覽器的gb2312格式來解釋iso-8859-1字符集的話,由於2者不兼容,所以會 是亂碼.

例子:  

    //1)將字符串用指定的編碼集合解析成字節數組,完成Unicode-〉//charsetName轉換  
    public byte[] getBytes(String charsetName) throws UnsupportedEncodingException   
    //2)將字節數組以指定的編碼集合構造成字符串,完成charsetName-〉Unicode轉換  
    public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException  

復制代碼

String s = "你好";
// 編碼
byte[] utf = s.getBytes("utf-8");
byte[] gbk = s.getBytes("gbk");
System.out.println("utf-8編碼:" + Arrays.toString(utf));//[-28,-67,-96,-27,-91,-67]  6個字節
System.out.println("gbk編碼:" + Arrays.toString(gbk));//[-60,-29,-70,-61] 4個字節
// 解碼
String s1 = new String(utf, "utf-8"); // 你好
String s2 = new String(utf, "gbk"); // gbk解碼:浣犲ソ gbk用2個字節解碼,所以會多一個字符
String s3 = new String(gbk, "utf-8"); // gbk用utf-8解碼:??? utf-8解碼需要6個字節
System.out.println("--------------------");
System.out.println("utf-8解碼:" + s1);
System.out.println("gbk解碼:" + s2);
System.out.println("gbk用utf-8解碼:" + s3);
System.out.println("---------------------");
System.out.println("用utf-8編碼回去");
s3 = new String(s3.getBytes("utf-8"), "gbk"); // 錕斤拷錕?   gbk用utf-8解碼后無法編回去
System.out.println(s3);

復制代碼

1

<code><img src="data:image/png;base64,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" alt=""><br></code>

規律:

utf-8編碼可以用gbk和iso8859-1解碼后編回去

gbk編碼后只能用iso8859-1解碼后編回去

3.4. 處理過程

  下面分析兩個有代表性的例子,說明java對編碼有關問題的處理方法。

3.4.1. 表單輸入

   User input  *(gbk:d6d0 cec4) 

  browser  *(gbk:d6d0 cec4) 

  web server  iso8859-1(00d6 00d 000ce 00c4)  class,

  需要在class中進行處理:

  getbytes("iso8859-1")為d6 d0 ce c4,

  new String("gbk")為d6d0 cec4,

  內存中以unicode編碼則為4e2d 6587。

  l 用戶輸入的編碼方式和頁面指定的編碼有關,也和用戶的操作系統有關,所以是不確定的,上例以gbk為例。

  l 從browser到web server,可以在表單中指定提交內容時使用的字符集,否則會使用頁面指定的編碼。而如果在url中直接用?的方式輸入參數,則其編碼往往是操作系統本身的編碼,因為這時和頁面無關。上述仍舊以gbk編碼為例。

  l Web server接收到的是字節流,默認時(getParameter)會以iso8859-1編碼處理之,結果是不正確的,所以需要進行處理。但如果預先設置了編碼(通過request. setCharacterEncoding ()),則能夠直接獲取到正確的結果。

  l 在頁面中指定編碼是個好習慣,否則可能失去控制,無法指定正確的編碼。

3.4.2. 文件編譯

  假設文件是gbk編碼保存的,而編譯有兩種編碼選擇:gbk或者iso8859-1,前者是中文windows的默認編碼,后者是Linux的默認編碼,當然也可以在編譯時指定編碼。

  Jsp  *(gbk:d6d0 cec4) 

  java file  *(gbk:d6d0 cec4) 

  compiler read  uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) 

  compiler write  utf(gbk: e4b8ad e69687; iso8859-1: *)

  compiled file  unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)  class。

  所以用gbk編碼保存,而用iso8859-1編譯的結果是不正確的。

  class  unicode(4e2d 6587)  system.out / jsp.out  gbk(d6d0 cec4)  os console / browser。

  l 文件可以以多種編碼方式保存,中文windows下,默認為ansi/gbk。

  l 編譯器讀取文件時,需要得到文件的編碼,如果未指定,則使用系統默認編碼。一般class文件,是以系統默認編碼保存的,所以編譯不會出問題,但對於jsp文件,如果在中文windows下編輯保存,而部署在英文linux下運行/編譯,則會出現問題。所以需要在jsp文件中用pageEncoding指定編碼。

  l Java編譯的時候會轉換成統一的unicode編碼處理,最后保存的時候再轉換為utf編碼。

  l 當系統輸出字符的時候,會按指定編碼輸出,對於中文windows下,System.out將使用gbk編碼,而對於response(瀏覽器),則使用jsp文件頭指定的contentType,或者可以直接為response指定編碼。同時,會告訴browser網頁的編碼。如果未指定,則會使用iso8859-1編碼。對於中文,應該為browser指定輸出字符串的編碼。

  l browser顯示網頁的時候,首先使用response中指定的編碼(jsp文件頭指定的contentType最終也反映在response上),如果未指定,則會使用網頁中meta項指定中的contentType。

3.5. javaEE幾處設置

  對於web應用程序,和編碼有關的設置或者函數如下。

3.5.1. jsp編譯

  指定文件的存儲編碼,很明顯,該設置應該置於文件的開頭。例如:<%@page pageEncoding="GBK"%>。另外,對於一般class文件,可以在編譯的時候指定編碼。

3.5.2. jsp輸出

  指定文件輸出到browser時使用的編碼,該設置也應該置於文件的開頭。例如:<%@ page contentType="text/html; charset= GBK" %>。該設置和response.setCharacterEncoding("GBK")等效。

3.5.3. meta設置

  指定網頁使用的編碼,該設置對靜態網頁尤其有作用。因為靜態網頁無法采用jsp的設置,而且也無法執行response.setCharacterEncoding()。例如:  <META http-equiv="Content-Type" content="text/html; charset=GBK" />

  如果同時采用了jsp輸出和meta設置兩種編碼指定方式,則jsp指定的優先。因為jsp指定的直接體現在response中。

  需要注意的是,apache有一個設置可以給無編碼指定的網頁指定編碼,該指定等同於jsp的編碼指定方式,所以會覆蓋靜態網頁中的meta指定。所以有人建議關閉該設置。

3.5.4. form設置

  當瀏覽器提交表單的時候,可以指定相應的編碼。例如:<form accept-charset= "gb2312">。一般不必不使用該設置,瀏覽器會直接使用網頁的編碼。

3.5.5. JSP頁面獲取表單的值

  在JSP頁面獲取表單的值時會出現亂碼,有兩種解決方法:

  1.post:在調用getParameter之前通過request.setCharacterEncoding設置字符編碼

  2.get:調用new String(str.getBytes("iso8859-1"), "UTF-8");編碼后解碼

4. 系統軟件

下面討論幾個相關的系統軟件。

4.1. MySQL數據庫

  很明顯,要支持多語言,應該將數據庫的編碼設置成utf或者unicode,而utf更適合與存儲。但是,如果中文數據中包含的英文字母很少,其實unicode更為適合。

  數據庫的編碼可以通過mysql的配置文件設置,例如default-character-set=utf8。

  還可以在數據庫鏈接URL中設置,例如: useUnicode=true&characterEncoding=UTF-8。

  注意這兩者應該保持一致,在新的sql版本里,在數據庫鏈接URL里可以不進行設置,但也不能是錯誤的設置。

  

Oracle中字符集編碼決定

 select userenv('language') from dual;

 SIMPLIFIED CHINESE_CHINA.ZHS16GBK

 SIMPLIFIED CHINESE_CHINA.AL32UTF8

 select lengthb('你') from dual;

 

4.2. apache

  appache和編碼有關的配置在httpd.conf中,例如AddDefaultCharset UTF-8。如前所述,該功能會將所有靜態頁面的編碼設置為UTF-8,最好關閉該功能。

  另外,apache還有單獨的模塊來處理網頁響應頭,其中也可能對編碼進行設置。

4.3. linux默認編碼

  這里所說的linux默認編碼,是指運行時的環境變量。兩個重要的環境變量是LC_ALL和LANG,默認編碼會影響到java URLEncode的行為,下面有描述。

  建議都設置為"zh_CN.UTF-8"。

4.4. 其它

  為了支持中文文件名,linux在加載磁盤時應該指定字符集,例如:mount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312。

  另外,如前所述,使用GET方法提交的信息不支持request.setCharacterEncoding(),但可以通過tomcat的配置文件指定字符集,在tomcat的server.xml文件中,形如:<Connector ... URIEncoding="GBK"/>。這種方法將統一設置所有請求,而不能針對具體頁面進行設置,也不一定和browser使用的編碼相同,所以有時候並不是所期望的。

5. URL地址

URL地址中含有中文字符是很麻煩的,前面描述過使用GET方法提交表單的情況,使用GET方法時,參數就是包含在URL中。

5.1. URL編碼

  對於URL中的一些特殊字符,瀏覽器會自動進行編碼。這些字符除了"/?&"等外,還包括unicode字符,比如漢字。這時的編碼比較特殊。

  IE有一個選項"總是使用UTF-8發送URL",

  當該選項有效時,IE將會對特殊字符進行UTF-8編碼,同時進行URL編碼。

  如果該選項無效,則使用默認編碼"GBK",並且不進行URL編碼。但是,對於URL后面的參數,則總是不進行編碼,相當於UTF-8選項無效。

  比如"中文.html?a=中文",

  當UTF-8選項有效時,將發送鏈接"%e4%b8%ad%e6%96%87.html?a=/x4e/x2d/x65/x87";

  而UTF-8選項無效時,將發送鏈接"/x4e/x2d/x65/x87.html?a=/x4e/x2d/x65/x87"。

  注意后者前面的"中文"兩個字只有4個字節,而前者卻有18個字節,這主要時URL編碼的原因。

  當web server(tomcat)接收到該鏈接時,將會進行URL解碼,即去掉"%",同時按照ISO8859-1編碼(上面已經描述,可以使用URLEncoding來設置成其它編碼)識別。

  上述例子的結果分別是"/ue4/ub8/uad/ue6/u96/u87.html?a=/u4e/u2d/u65/u87"和"/u4e/u2d/u65/u87.html?a=/u4e/u2d/u65/u87",

  注意前者前面的"中文"兩個字恢復成了6個字符。這里用"/u",表示是unicode。

  所以,由於客戶端設置的不同,相同的鏈接,在服務器上得到了不同結果。這個問題不少人都遇到,卻沒有很好的解決辦法。所以有的網站會建議用戶嘗試關閉UTF-8選項。不過,下面會描述一個更好的處理辦法。

5.2. rewrite

  熟悉的人都知道,apache有一個功能強大的rewrite模塊,這里不描述其功能。需要說明的是該模塊會自動將URL解碼(去除%),即完成上述web server(tomcat)的部分功能。有相關文檔介紹說可以使用[NE]參數來關閉該功能,但我試驗並未成功,可能是因為版本(我使用的是apache 2.0.54)問題。另外,當參數中含有"?& "等符號的時候,該功能將導致系統得不到正常結果。

  rewrite本身似乎完全是采用字節處理的方式,而不考慮字符串的編碼,所以不會帶來編碼問題。

5.3. URLEncode.encode()

  這是Java本身提供對的URL編碼函數,完成的工作和上述UTF-8選項有效時瀏覽器所做的工作相似。值得說明的是,java已經不贊成不指定編碼來使用該方法(deprecated)。應該在使用的時候增加編碼指定。

  當不指定編碼的時候,該方法使用系統默認編碼,這會導致軟件運行結果得不確定。比如對於"中文",當系統默認編碼為"gb2312"時,結果是"%4e%2d%65%87",而默認編碼為"UTF-8",結果卻是"%e4%b8%ad%e6%96%87",后續程序將難以處理。

  另外,這兒說的系統默認編碼是由運行tomcat時的環境變量LC_ALL和LANG等決定的,曾經出現過tomcat重啟后就出現亂碼的問題,最后才郁悶的發現是因為修改修改了這兩個環境變量。

  建議統一指定為"UTF-8"編碼,可能需要修改相應的程序。

6. 其它

下面描述一些和編碼有關的其他問題。

6.1. SecureCRT

  除了瀏覽器和控制台與編碼有關外,一些客戶端也很有關系。比如在使用SecureCRT連接linux時,應該讓SecureCRT的顯示編碼(不同的session,可以有不同的編碼設置)和linux的編碼環境變量保持一致。否則看到的一些幫助信息,就可能是亂碼。

  另外,mysql有自己的編碼設置,也應該保持和SecureCRT的顯示編碼一致。否則通過SecureCRT執行sql語句的時候,可能無法處理中文字符,查詢結果也會出現亂碼。

  對於Utf-8文件,很多編輯器(比如記事本)會在文件開頭增加三個不可見的標志字節,如果作為mysql的輸入文件,則必須要去掉這三個字符。(用linux的vi保存可以去掉這三個字符)。一個有趣的現象是,在中文windows下,創建一個新txt文件,用記事本打開,輸入"連通"兩個字,保存,再打開,你會發現兩個字沒了,只留下一個小黑點。

6.2. 過濾器

  如果需要統一設置編碼,則通過filter進行設置是個不錯的選擇。在filter class中,可以統一為需要的請求或者回應設置編碼。參加上述setCharacterEncoding()。這個類apache已經給出了可以直接使用的例子SetCharacterEncodingFilter。

6.3. POST和GET

  很明顯,以POST提交信息時,URL有更好的可讀性,而且可以方便的使用setCharacterEncoding()來處理字符集問題。

  但GET方法形成的URL能夠更容易表達網頁的實際內容,也能夠用於收藏。

  從統一的角度考慮問題,建議采用GET方法,這要求在程序中獲得參數是進行特殊處理,而無法使用setCharacterEncoding()的便利,如果不考慮rewrite,就不存在IE的UTF-8問題,可以考慮通過設置URIEncoding來方便獲取URL中的參數。

6.4. 簡繁體編碼轉換

  GBK同時包含簡體和繁體編碼,也就是說同一個字,由於編碼不同,在GBK編碼下屬於兩個字。有時候,為了正確取得完整的結果,應該將繁體和簡體進行統一。可以考慮將UTF、GBK中的所有繁體字,轉換為相應的簡體字,BIG5編碼的數據,也應該轉化成相應的簡體字。當然,仍舊以UTF編碼存儲。

  例如,對於"語言 語言",

  用UTF表示為"/xE8/xAF/xAD/xE8/xA8/x80 /xE8/xAA/x9E/xE8/xA8/x80",

  進行簡繁體編碼轉換后應該是兩個相同的 "/xE8/xAF/xAD/xE8/xA8/x80>"。

 

參考:http://blog.csdn.net/qinysong/article/details/1179513

    http://blog.csdn.net/xiongchao2011/article/details/7276834

   http://wessongao.iteye.com/blog/1497503


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM