UTF-8編碼與GBK編碼之間的轉換
一.先看一段程式碼
下面一段程式碼,將字串在GBK與UTF-8之間進行兩次轉換,第一次生成亂碼(UTF-8的位元組碼用GBK解析),第二次反推這個過程,應該會生成正確的字串.
但是有些中文字卻變成了'???'一類的亂碼.只是其中的一些...
private static void print(byte[] bs){
for(byte b:bs)
System.out.print(Integer.toHexString(b).replace("ff","")+" ");
System.out.println();
}
public static void main(String[] args) throws UnsupportedEncodingException {
String utf8="UTF-8";
String gbk="GBK";
String source="可憐";
byte[] sourcebyte=source.getBytes(utf8);
//將字串轉換成UTF-8編碼
System.out.println(source);
//列印原字串
print(sourcebyte);
//================================================
String temp=new String(sourcebyte,gbk);
//使用字串生成的UTF-8編碼生成GBK編碼字串
System.out.println(temp);
//列印結果亂碼,意料之中,因為UTF-8中文3位元組,而GBK中文大多為雙位元組,能匹配成功就非亂碼,否則使用??替代
//================================================
byte[] targetbyte=temp.getBytes(gbk);
String target=new String(targetbyte,utf8);
System.out.println(target);
//列印最終字串
print(targetbyte);
}
上面的程式碼會列印出:
可憐
e5 8f af e6 80 9c
鍙???
可???
e5 8f af e6 3f 3f
二.結果解析
1. 程式中使用了UTF-8 —》GBK —》UTF-8,整個是一個轉換和逆轉換的過程,按照原先的設想,應該列印出原來的輸入值“可憐”,而結果卻出現了亂碼,中間這個轉換的具體細節是什麼樣的呢?
2. 先使用UTF-8,將字串轉換成位元組形式,UTF-8在中文狀態下為3位元組編碼,而兩個漢字是6個位元組。
3. 將生成的UTF-8位元組使用GBK編碼轉換成字串,GBK在中文狀態下為2位元組編碼,如果能匹配,正好3個漢字,看一下GBK編碼範圍:
名稱 |
第一位元組 |
第二位元組 |
GB2312 |
0xB0-0xF7(176-247) |
0xA0-0xFE(160-254) |
GBK |
0x81-0xFE(129-254) |
0x40-0xFE(64-254) |
Big5 |
0x81-0xFE(129-255) |
0x40-0x7E(64-126) 0xA1-0xFE(161-254) |
編碼1~2: e5 8f 高位元組位符合,低位元組位也符合,列印結果:鍙
編碼3~4: af e6 高位元組位符合,低位元組位也符合,列印結果:(空格)
編碼5~6: 80 9c 高位元組位不符合,低位元組位符合,未能找到結果,以??替代
4. 使用GBK,將字串轉換成位元組形式,前4個位元組因為能在GBK中找到,所以原樣輸出了,而最後兩個位元組80 9c無法找到,被替換成了??,所以被轉換成了位元組3f 3f(3f十進位制63,即?的編碼)。
5. 最後再次使用UTF-8編碼將逆向轉換回來的位元組轉換成字串時,前3個位元組可以正常輸出為漢字,而第4個位元組未能找到,顯示為?,第5、6個位元組正常輸出都為?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-710925/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP中文GBK編碼轉UTF-8PHP
- Unicode、GBK、UTF-8、ASCII的編碼簡介UnicodeASCII
- UTF-8編碼規則(轉)
- 編碼轉換
- URL編碼轉換
- 字元編碼轉換字元
- xls 編碼 utf-8
- Python 編碼轉換與中文處理Python
- 檢測檔案編碼,轉換檔案編碼
- java工具類之編碼轉換工具類Java
- java中文字串漢字轉GBK編碼Java字串
- JS 簡單實現UTF-8編碼,Base64編碼JS
- 編碼轉換統一防止亂碼
- 字元編碼發展史4 — Unicode與UTF-8字元Unicode
- 轉換Linux 檔案編碼方式Linux
- 學習電腦編碼utf-8,ansi編碼的基礎知識等
- maven編譯遇到"編碼GBK的不可對映字元"警告的處理Maven編譯字元
- Java 正確的做字串編碼轉換Java字串編碼
- Unicode中UTF-8與UTF-16編碼詳解Unicode
- ptyon 特殊處理 url 編碼與解碼,字元編碼轉化 unicode字元Unicode
- ffmpeg音訊編碼之pcm轉碼aac音訊
- SpringMVC的亂碼與時間轉換SpringMVC
- Java實現BCD編碼與十進位制轉換Java
- 用Javascript實現UTF8編碼轉換成gb2312編碼JavaScript
- 字元編碼:Unicode & UTF-16 & UTF-8字元Unicode
- Windows CMD永久設定UTF-8編碼Windows
- docker 容器指定utf-8編碼,解決中文亂碼Docker
- 影像壓縮編碼碼matlab實現——變換編碼Matlab
- 萬能java字串編碼轉換工具類Java字串編碼
- 解決java“錯誤:編碼GBK的不可對映字元”Java字元
- OpenLR 的編碼與解碼
- 網頁地址編碼解碼(網頁地址明文密文轉換)url編碼解碼 Python3網頁Python
- Idea編碼UTF-8中.properties 配置檔案中文亂碼Idea
- java安全編碼指南之:字串和編碼Java字串
- python編寫圖片主色轉換指令碼Python指令碼
- 編碼與幽默
- Python教程:Pandas資料轉換編碼的10種方式Python
- UTF-8 編碼及檢查其完整性
- utf-8和gbk