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-8編碼的轉換PHP字元
- PHP中文GBK編碼轉UTF-8PHP
- java編碼之間轉換Java
- Unicode、GBK、UTF-8、ASCII的編碼簡介UnicodeASCII
- java RSA公私鑰與其base64編碼之間的轉換Java
- 編碼轉換
- Asp.net把UTF-8編碼轉換為GB2312編碼ASP.NET
- WindowsPhone的中文GB2312、GBK編碼與Unicode相互轉換WindowsUnicode
- 程式設計實現GBK到UFT-8編碼的轉換程式設計
- 字元編碼轉換字元
- URL編碼轉換
- .net例項:Asp.net把UTF-8編碼轉換為GB2312編碼ASP.NET
- 位元組編碼轉換
- java字元編碼轉換Java字元
- 檢測檔案編碼,轉換檔案編碼
- java工具類之編碼轉換工具類Java
- 文字編碼轉換工具iconv 附批量轉換檔案編碼命令
- Python 編碼轉換與中文處理Python
- Linux 字元編碼 檢視與轉換Linux字元
- php 的字元編碼轉換工具 (轉)PHP字元
- C# 基礎知識:字元編碼、編碼轉換C#字元
- PHP中的字串、編碼、UTF-8PHP字串
- javascript字元編碼轉換方法JavaScript字元
- Linux批量編碼轉換Linux
- iconv字元編碼轉換字元
- 符號編碼-ASCII、Unicode、Unicode big endian、UTF-8之間的關係(轉)符號ASCIIUnicode
- 多位元組與UTF-8、Unicode之間的轉換Unicode
- JS 簡單實現UTF-8編碼,Base64編碼JS
- java中文字串漢字轉GBK編碼Java字串
- 設定Tomcat的UTF-8編碼Tomcat
- Linux下檢視檔案編碼,檔案編碼格式轉換和檔名編碼Linux
- 學習電腦編碼utf-8,ansi編碼的基礎知識等
- jQuery ajax提交中文編碼(gbk)解決jQuery
- Aptana漢化,不支援GBK編碼問題APT
- Windows Phone 7 中將Gb2312編碼轉換成UTF-8Windows
- Java 正確的做字串編碼轉換Java字串編碼
- 關於JS的編碼轉換問題JS
- maven編譯遇到"編碼GBK的不可對映字元"警告的處理Maven編譯字元