Java 中文字串編碼之GBK轉UTF 8

2021-08-02 07:48:54 字數 1251 閱讀 5329

寫過兩篇關於編碼的文章了,以為自己比較了解編碼了呢?!

結果今天又結結實實的上了一課。

以前轉來轉去解決的問題終歸還是簡單的情形。即iso-8859-1轉utf-8,或者iso-8859-1轉gbk,gb2312之類。這種無損轉換,一行**就搞定。

今天遇到了gbk轉utf-8。無論怎麼轉,都是亂碼。

一、亂碼的原因

gbk的中文編碼是乙個漢字用個位元組表示,例如漢字「內部」的gbk編碼16進製制的顯示為c4 da b2 bf

utf-8的中文編碼是乙個漢字用個位元組表示,例如漢字「內部」的utf-8編碼16進製制的顯示為e5 86 85 e9 83 a8

很顯然,gbk是無法直接轉換成utf-8,少位元組變為多位元組,誰知道缺少的位元組是什麼啊?!

二、轉換的辦法

有辦法實現「有損」轉換嗎?答案是肯定的。

1.首先將gbk字串getbytes()得到兩個原始位元組,轉換成二進位制字元流,共16位。

2.根據utf-8的漢字編碼規則,首位元組以1110開頭,次位元組以10開頭,第3位元組以10開頭。在原始的2進製字串中插入標誌位。最終的長度從16--->16+3+2+2=24。

3.轉換完成,實際情況需要考慮更多因素,例如字串是漢字和數字的混合體,需要識別處理數字。

三、不要重**明輪子

這段**測試可用還很好用,需要的可以參考。

1

public

static

string getutf8stringfromgbkstring(string gbkstr) catch

(unsupportedencodingexception e)

7} 89

public

static

byte

getutf8bytesfromgbkstring(string gbkstr)

19 utfbytes[k++] = (byte) (0xe0 | (m >> 12

));

20 utfbytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f

));

21 utfbytes[k++] = (byte) (0x80 | (m & 0x3f

));

22}

23if (k

28return

utfbytes;

29 }

中文字串的編碼轉換 UTF 8 GBK

golang在處理中文時預設的是utf 8編碼,當某些情況下遇到gbk編碼或需要gbk編碼時,就會出現顯示亂碼的問題。golang官方有針對中文編碼轉換的包 golang.org x text encoding simplifiedchinese import golang.org x text e...

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...

Java 中文字元編碼

public class test for int i 0 i string類的不帶引數的getbytes 方法會以程式所執行平台的預設編碼方式為準來進行轉換,在不同環境下可能會有不同的結果,因此建議使用指定編碼方式的getbytes string charsetname 方法。public sta...