寫過兩篇關於編碼的文章了,以為自己比較了解編碼了呢?!
結果今天又結結實實的上了一課。
以前轉來轉去解決的問題終歸還是簡單的情形。即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.轉換完成,實際情況需要考慮更多因素,例如字串是漢字和數字的混合體,需要識別處理數字。
三、不要重**明輪子
這段**測試可用還很好用,需要的可以參考。
1public
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...