1. 程式人生 > >Java 中文字串編碼之GBK轉UTF-8

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

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

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

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

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

一、亂碼的原因

gbk的中文編碼是一個漢字用【2】個位元組表示,例如漢字“內部”的gbk編碼16進位制的顯示為c4 da b2 bf

utf-8的中文編碼是一個漢字用【3】個位元組表示,例如漢字“內部”的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) {  
2 try { 3 return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8"); 4 } catch (UnsupportedEncodingException e) { 5 throw new InternalError(); 6 } 7 } 8 9 public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
10 int n = gbkStr.length(); 11 byte[] utfBytes = new byte[3 * n]; 12 int k = 0; 13 for (int i = 0; i < n; i++) { 14 int m = gbkStr.charAt(i); 15 if (m < 128 && m >= 0) { 16 utfBytes[k++] = (byte) m; 17 continue; 18 } 19 utfBytes[k++] = (byte) (0xe0 | (m >> 12)); 20 utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f)); 21 utfBytes[k++] = (byte) (0x80 | (m & 0x3f)); 22 } 23 if (k < utfBytes.length) { 24 byte[] tmp = new byte[k]; 25 System.arraycopy(utfBytes, 0, tmp, 0, k); 26 return tmp; 27 } 28 return utfBytes; 29 }
複製程式碼

PS:有點兒對不住原作者,找了很多程式碼,一一測試,結果網頁都關閉了,如果有大神認領,我一定補充連結,而且深表感謝。

相關推薦

Java 中文字串編碼GBKUTF-8

寫過兩篇關於編碼的文章了,以為自己比較瞭解編碼了呢?! 結果今天又結結實實的上了一課。 以前轉來轉去解決的問題終歸還是簡單的情形。即iso-8859-1轉utf-8,或者iso-8859-1轉gbk,gb2312之類。這種無損轉換,一行程式碼就搞定。 今天遇到了gbk轉utf-8。無論怎麼轉,都是亂碼。 一

檔案編碼轉化 GBK UTF-8工具類

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import ja

java gbkutf-8亂碼問題

最近在做一個反饋功能,把資料反饋到對方公司網站,我公司是GBK編碼,對方公司是UTF-8編碼。因此,我需要將GBK編碼資料轉換成UTF-8編碼資料,這樣對方網站才不會亂碼。最簡單的方法是將HttpClient的ContentCharset設定為utf-8;如果Content

Java中文字串與unicode互工具類

原理利用了java實現js的escape以及unescape函式。 /** * 中文字串和unicode互轉工具類 <br> * * @author hkb <br> */ public class UnicodeConver

java程式碼中GBKUTF-8的工具類

一.程式碼示例 public static byte[] getUTF8BytesFromGBKString(String gbkStr) { int n = gbkStr.length(); byte[] utfBytes = new byte[3 * n]; in

刨根究底字符編碼十一——UTF-8編碼方式與字節序標記

所有 碼元 unix 找到 概念 不可見 執行 大端 位置 UTF-8編碼方式與字節序標記 一、UTF-8編碼方式 1. 接下來將分別介紹Unicode字符集的三種編碼方式:UTF-8、UTF-16、UTF-32。這裏先介紹應用最為廣泛的UTF-8。 為滿足基於AS

網頁格式gbkutf-8【python requests】

sts url ont content req utf nic tex ext resp = requests.get(url) resp.content 是str格式 resp.text是unicode格式 如果返回的中文使用gbk編碼,需要轉換成utf-8的時候:

【Python基礎】字符編碼ASCII-GBK-Unicode-UTF-8之間的關系

精準 應該 寫入 歷程 UC tran 執行 文件 總結 字符編碼 由於計算機只識別0和1,為了使計算機能夠支持文字和字母等符號,方便實用操作計算機 於是字符編碼應運而生,旨在解決符號和人類語言與計算機0和1建立起一種對應關系 據說不理解字符編碼可能是程序員一輩子的遺憾,拿

C語言漢字gbkutf-8

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

GBKUTF-8時,奇數箇中文會亂碼,偶數箇中文不會亂碼

遇到的問題的場景: 兩個後臺伺服器互動,兩個專案的預設編碼都是UTF-8,但是當互動時(A->B),就會出現奇數箇中文時會亂碼。 重點:GBK編碼是一箇中文2個位元組,而UTF-8編碼是一箇中文3個位元組,當我們呼叫getBytes(“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

Java專案GBK編碼UTF-8

方法一:使用Apache的common-io 1.maven專案pom.xml <dependency> <groupId>commons-io</groupId> <artif

判斷中文文字編碼格式是gbk還是utf-8的一種簡單方式

import java.io.*; public class charsetTest { public static String charsetType(String fileName) throws IOException { BufferedReader reader =

字串utf-8gbk

有如下字串:n = "路飛學城"(程式設計題)       - 將字串轉換成utf-8的字元編碼,再將轉換的位元組重新轉換為utf-8的字元編碼 n = "路飛學城" n_e_u = n.encode("utf-8") # b'\xe8\xb7\xaf\x

python中文編碼問題(decode('gbk').encode('utf-8')和decode('utf-8').encode('gbk')這對好基友)

    想必每個Python新手都會遇到Python編碼的問題,特別是使用到漢字的時候。UTF-8編碼是比較通用的編碼方式,它可以輸出中文,而Python2中預設的編碼方式一般是GBK,所以往往我們期

java字串中含有unicode 中文

private static String ascii2native ( String asciicode )     {         String[] asciis = asciicode.split ("\\\\u");         String nativeV

使用java的native2ascii工具命令來轉換編碼gbk,gb2312,utf-8

 native2ascii的用法Sun也太吝嗇了,也不多給點使用例子.它的幫助只有:用法:native2ascii [-reverse] [-encoding 編碼] [輸入檔案 [輸出檔案]] 下邊是網上找的說明,說的不是很清楚:----------------------

java中文亂碼解決道(三)-----編碼詳情:偉大的創想---Unicode編碼

隨著計算機的發展、普及,世界各國為了適應本國的語言和字元都會自己設計一套自己的編碼風格,正是由於這種亂,導致存在很多種編碼方式,以至於同一個二進位制數字可能會被解釋成不同的符號。為了解決這種不相容的問題

Android ndk中字串utf-8gbk

轉utf-8jstring cToJstringutf(JNIEnv* env, const char* pat) { jclass strClass = (*env)->FindClass(env, "java/lang/String"); jmethodID

C++ 過濾出字串中文GBKUTF-8

最近在處理遊戲敏感詞之類的東西,為了加強遮蔽處理,所以需要過濾掉字串中的除漢字之外的是其他東西如數字,符號,英文字母等。 首先我查閱資料並寫了個函式: 示例:返回輸入字串中漢字的個數: std::string StrWithOutSymbol(const std::string &sourc