天天看點

java 中文編碼問題

java正常編碼問題

package com.boco;

import java.io.UnsupportedEncodingException;

import java.net.URLDecoder;

import java.net.URLEncoder;

public class UnicodeCase {

                 public static void main(String[] args) throws UnsupportedEncodingException {

  byte[] str1="中".getBytes("utf8");

  byte[] str2="中".getBytes("gbk");

  byte[] str3="中".getBytes("iso8859-1");

  for(int i=0;i<str1.length;i++){

  System.out.print(str1[i]);

  }

                                           System.out.println();

  System.out.println(str1);

  System.out.println(str2);

  System.out.println(str3);

  String a=new String(str1,"utf8");

  String b=new String(str2,"gbk");

  String c=new String(str3,"iso8859-1");

  String d=new String(str1,"iso8859-1");

  System.out.println(a);

  System.out.println(b);

  System.out.println(c);

  System.out.println(new String(d.getBytes("iso8859-1"),"utf8"));

}

}

運作結果:

-28-72-83

[[email protected]

[[email protected]

[[email protected]

?

出現此種問題主要是  java對中文字元的編碼問題  

漢字 utf-8 三個位元組表示  gbk 2個位元組表示   

沒有iso8859-1編碼 但是可以表示  (屬于單位元組編碼,最多能表示的字元範圍是0-255,應用于英文系列。比如,字母a的編碼為0x61=97。 很明顯,iso8859-1編碼表示的字元範圍很窄,無法表示中文字元。但是,由于是單位元組編碼,和計算機最基礎的表示機關一緻,是以很多時候,仍舊使用iso8859-1編碼來表示。而且在很多協定上,預設使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是"d6d0 cec4"兩個字元(Java字元占2個位元組),使用iso8859-1編碼的時候則将它拆開為4個位元組來表示:"d6 d0 ce c4"(事實上,在進行存儲的時候,也是以位元組為機關處理的))

getBytes() 是Java程式設計語言中将一個字元串轉化為一個位元組數組byte[]的方法。String的getBytes()方法是得到一個系統預設的編碼格式的位元組數組。将一個String類型的字元串中包含的字元轉換成byte類型并且存入一個byte[]數組中。在java中的所有資料底層都是位元組,位元組資料可以存入到byte數組。(詳情可以檢視api  免費下載下傳位址http://download.csdn.net/detail/docuxu/9908841)

從上面的執行個體程式中 我們可以看出 utf8 和gbk的編碼格式 在字元串和位元組數組的形式下 可以互相轉化。而 iso8859-1此種編碼格式則在字元串轉化為位元組數組後 無法恢複。如果真的需要使用iso8859-1編碼格式  我們可以使用utf或gbk的編碼格式将其先轉化為位元組數組 然後再使用iso8859-1 最後還是通過對應編碼恢複 知識中間對位元組數組使用了iso8859-1。

URL參數編碼問題

一、為什麼要用URLEncoder

用戶端在進行網頁請求的時候,網址中可能會包含非ASCII碼形式的内容,比如中文。而直接把中文放到網址中請求是不允許的,是以需要用URLEncoder編碼位址,網址中的非ASCII碼内容轉換成可以傳輸的字元。

不會被編碼的内容:

1.大寫字母A-Z

2.小寫字母a-z

3.數字 0-9

4.标點符 - _ . ! ~ * ' (和 ,)

二、編碼原理

1、将需要轉換的内容(ASCII碼形式之外的内容),用十六進制表示法轉換出來,并在之前加上%開頭

eg:  0x9c  URLEncoder --> %9c

2、内容中的空格‘ ’ ,全部用+代替

3、注:與Hex不同,Hex是将所有的字元轉換為16進制表示,而URLEncoder是将ASCII碼集之外的轉換為%加上相應的16進制,而ASCII碼集内的字元不進行處理

三、應用場景

1、所有的GET請求

2、網址中有中文等情況

3、POST請求,所有的Key和Value在送出之前都要經過URLEncoder

四、示例

try {

    String a = URLEncoder.encode("a", "UTF-8");

    Log.i("encode","a 進行URLEncoder編碼後-->"+a );

    String b = URLEncoder.encode("a中", "UTF-8");

    Log.i("encode","a中 進行URLEncoder編碼後-->"+b );

    String decode = nURLDecoder.decode("a%E4%B8%AD", "UTF-8");

    Log.i("encode","a%E4%B8%AD 進行URLDecoder解碼後-->"+decode);

} catch (UnsupportedEncodingException e) {

    e.printStackTrace();

}

運作結果:

a 進行URLEncoder編碼後-->a

a中 進行URLEncoder編碼後-->a%E4%B8%AD

a%E4%B8%AD 進行URLDecoder解碼後-->a中

可以看出 字元'a' 并沒有編碼  而 中文 '中' 進行了編碼

與URLEncoder編碼對應的是URLDecoder解碼 

可以看出 "a中"--編碼-->"a%E4%B8%AD"--解碼-->"a中"