理解並解決GBK轉UTF 8奇數中文亂碼

2021-09-01 19:30:20 字數 1774 閱讀 9959

文章源自:

理解並解決gbk轉utf-8奇數中文亂碼

最近在做乙個反饋功能,把資料反饋到對方公司**,我公司是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 

/*今年??011??

*/

原因:為什麼只有奇數個中文才亂碼,偶數個卻不亂碼?下面來分析原因

public static void analyze() 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 

/*鎴戞潵浜?

*/

因為檔案是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

我來了*/

C語言漢字gbk轉utf 8

一 注意事項 1.請注意漢字內碼 對應字元為 xcc等 和列印出的轉義字元 xcc 的區別!該問題導致我們程式除錯了差不多一整天!見 c語言中轉義字元的使用 2.另外庫函式iconv會把傳入的引數指標移位,這是正常的 請不要認為是自己程式有問題。3.我的終端是utf 8格式,對於其他編碼不能顯示。二...

PHP中文GBK編碼轉UTF 8

iconv 和 mb convert encoding的區別 string mb convert encoding string str,string to encoding mixed from encoding 需要先enable mbstring 擴充套件庫,在 php.ini裡將 exten...

關於qt中文utf 8轉gbk

筆者經歷了糟心的兩天時間,說多了都是淚,希大家有所幫助,不再同乙個地方浪費時間。筆者的任務 從資料庫獲取utf 8編碼的含中文的字串,並在linux平台使用qt顯示在 中。筆者所遇問題 中文始終為亂碼,度娘上mian函式加類似下面的函式也並沒用 qtextcodec codec qtextcodec...