java gbk轉utf 8亂碼問題

2021-07-02 15:14:32 字數 2066 閱讀 1368

最近在做乙個反饋功能,把資料反饋到對方公司**,我公司是gbk編碼,對方公司是utf-8編碼。因此,我需要將gbk編碼資料轉換成utf-8編碼資料,這樣對方**才不會亂碼。最簡單的方法是將httpclient的contentcharset設定為utf-8;如果contentcharset是gbk並且又不想設定為utf-8,那麼就需要將資料轉換成utf-8編碼再發到對方**。

問題出現:gbk轉utf-8時,奇數個中文會亂碼,偶數個中文不會亂碼。

三個中文 

public static void encodeerror() throws unsupportedencodingexception /*我來??*/ 前面三個中文,後面乙個中文,都是奇數

public static void encodeerror2() throws unsupportedencodingexception  

system.out.println();

for (byte b : utf8.getbytes())  

} /*

-26 -120 -111 -26 -99 -91 -28 -70 -122 

-26 -120 -111 -26 -99 -91 -28 -70 63 ! 

*/ 注意最後乙個位元組不同,上面一行才是正確的utf-8編碼。那麼為什麼下面一行最後乙個位元組是63,而不是-122呢?這就是導致亂碼的原因所在。

gbk編碼是乙個中文2個位元組,而utf-8編碼是乙個中文3個位元組,當我們呼叫getbytes("utf-8")方法時,會通過計算來增加位元組,使得從gbk的2個位元組變成utf-8對應的3個位元組。因此,上例3個中文輸出了9個位元組。

這裡講一下怎麼通過計算增加位元組,不深究的讀者可以跳過此段。為了醒目,直接用**講解

public static void gbk2utf() throws unsupportedencodingexception  

//增加位,達到到24位3個位元組

sb.insert(0, "1110"); 

sb.insert(8, "10");

sb.insert(16, "10"); 

fullbyte[i*3] = integer.valueof(sb.substring(0, 8), 2).bytevalue();//二進位制字串建立整型 

fullbyte[i*3+1] = integer.valueof(sb.substring(8, 16), 2).bytevalue();

fullbyte[i*3+2] = integer.valueof(sb.substring(16, 24), 2).bytevalue();

} @, n* v4 r3 n0 t

//模擬utf-8編碼的**顯示

system.out.println(new string(fullbyte,"utf-8")); 

}現在我們來找出最後乙個位元組是63,而不是-122的原因。 

public static void analyze2() throws unsupportedencodingexception  

/*鎴戞潵浜? 

*/ 因為檔案是gbk編碼,new string(utfbytes)預設就是new string(utfbytes,"gbk")。它會2個位元組2個位元組地轉換成字元,當位元組是奇數時最後1個位元組轉字元就會計算錯誤,然後直接賦予最後這個字元為?,對應ascii**就是63。

解決問題 

保證位元組正確才是硬道理。當呼叫getbytes("utf-8")轉換成位元組陣列後,建立iso-8859-1編碼的字串,iso-8859-1編碼是乙個位元組對應乙個字元,因此不會使最後乙個位元組錯誤。

public static void correctencode() throws unsupportedencodingexception

system.out.println(); 

//模擬utf-8編碼的**顯示

system.out.println(new string(iso.getbytes("iso-8859-1"),"utf-8"));

}/* 

-26 -120 -111 -26 -99 -91 -28 -70 -122 

我來了*/

java gbk轉utf 8亂碼問題

最近在做乙個反饋功能,把資料反饋到對方公司 我公司是gbk編碼,對方公司是utf 8編碼。因此,我需要將gbk編碼資料轉換成utf 8編碼資料,這樣對方 才不會亂碼。最簡單的方法是將httpclient的contentcharset設定為utf 8 如果contentcharset是gbk並且又不想...

網頁utf 8亂碼 utf8亂碼

複製 在前 在windows作業系統上使用ie作為瀏覽器時。常常會發生這樣的問題 在瀏覽使用utf 8編碼的網頁時,瀏覽器無法自動偵測 即沒有設定 自動選擇 編碼格式時 該頁面所用的編碼。即使網頁已經宣告過編碼格式 由此造成某些含有中文utf 8編碼的頁面產生空白輸出。由於utf 8為3個位元組表示...

《轉》亂碼UTF8和UTF 8網頁編碼

曾經被字符集間複雜的轉換搞怕了,正好新專案要求國際化,需要能夠顯示多種語言,於是一開始就規定統統使用 utf 8 編碼。所有 檔案使用 utf 8 編碼存檔 mysql資料庫所有表,所有字段設定 collation 中文翻譯為 整理 屬性為 utf8 general ci 所有頁面輸出 即便是這樣,...