JAVA中ASCII轉碼問題
阿新 • • 發佈:2019-01-23
問題補充:
String s1 = new String(chinaString.getBytes("US-ASCII"),"GB2312"); String s2 = new String(chinaString.getBytes("US-ASCII"),"UTF-8"); String s3 =new String(chinaString.getBytes("ISO-8859-1"),"GBK"); 和其他的位元組符都方試過了,都不行!打印出來的都是:?? 回:尋找逆流的魚 -- 不是我想用ACSII碼,而是前面我說了是業務需要,對方的介面返回給我的就是這樣,我也很無耐。所以在這裡向大俠們請教!
回答:
看了幾位的回答,感覺有點好笑,樓主本身就出了一個假命題,幾位回答都沒有弄清字符集的轉換,樓主也不知道自己本身就犯了一個致命錯誤,“你好”本身就是一個多位編碼,你卻硬要用低位碼去解碼,不出錯才怪呢?
String s1 =new String(chinaString.getBytes("gb2312"),"ISO-8859-1");
這裡的gb2312可以省略,系統會預設用你控制面板設定好的字符集,因為原來“你好”是多位編碼,所以必須用多位編碼去解碼,也就是gb2312或utf-8去解碼,這樣chinaString.getBytes("gb2312")就變成一個byte陣列,這時候你可以隨意重新指定編碼如iso-8859-1,這是s1就變成一個是iso-8859-1編碼的字串,如果你想重新轉為中文,那麼,你用什麼字符集編碼的,必須用什麼字符集來解碼,這裡是iso-8859-1,可以這麼來做
String s2 = new String(s1.getBytes("ISO-8859-1"),"gb2312");
這樣s2又重新變回中文了,所以當你列印s2時,就是“你好”。
還有一個問題,為什麼這裡用iso-8859-1來重新編碼,而不用其他的字符集呢?這裡因為,其他字符集無法相互轉碼而發生編碼丟失現象,你可以試試,把iso-8850-1換成utf-8試試,這無法重新轉回來,這導致亂碼現象,如果你ios-8850-1換成gbk,大部分是可以的,因為gbk相容gb2312,但是,不是所有的都能相互轉回來,最好用iso-8850-1來作為中間轉碼字符集,這是因為所有的字符集都對iso-8859-1相容,不管是gbk還是gb2312,utf-8,都能完美地轉換回來。
說了這麼多,可能大家還有點迷糊,這應用在什麼地方。我舉個例子,大家知道,經常有人做網路爬蟲,把網頁下載下來,但是,網頁編碼各種各樣,主要有iso-8859-1,gbk,gb2312,utf-8,網頁以io位元組流下載下來,要想把它轉換字元流,也就是文字,這時候要知道編碼是什麼。怎麼辦呢?這樣做,不管它,首先以iso-8859-1編碼轉換過來,然後再用正則表示式看看網頁頭部,如:
<meta content="text/html; charset=gb2312" http-equiv="Content-Type">,這時就知道這個網頁的編碼是gb2312,再利用這個式子
String s2 = new String(s1.getBytes("ISO-8859-1"),"gb2312");
s2就能正確顯示網頁內容。假如你用其他字符集如utf-8作為中間碼,也能知道網頁編碼是gb2312,但這是你用式子
String s2 = new String(s1.getBytes("utf-8"),"gb2312"),就會出現亂碼現象,所以最好用iso-8859-1作為中間碼。
所以,樓主除了犯以上錯誤以外,還有,就不應該用US-ASCII作為中間碼,否則,是不能轉換為中文的,它們之間無法做到相互轉換,只有iso-8859-1才能完美轉換成其他編碼。