Java字符轉(zhuǎn)碼之UTF-8互轉(zhuǎn)GBK具體實(shí)現(xiàn)
Java UTF-8轉(zhuǎn)GBK詳解
java跟python類似的做法,在java中字符串的編碼是java修改過(guò)的一種Unicode編碼,所以看到j(luò)ava中的字符串,心理要默念這個(gè)東西是java修改過(guò)的一種Unicode編碼的編碼。
package string; import java.nio.charset.Charset; public class UTF82GBK { public static void main(String[] args) throws Exception { //系統(tǒng)的默認(rèn)編碼是GBK System.out.println("Default Charset=" + Charset.defaultCharset()); String t = "hfjkds中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)中國(guó)hfsdkj<img src=‘sasa‘ /> fjldsajflkdsjaflkdsjalf <img src=‘sada‘ ait=‘‘/>sfdsfadas"; //思路:先轉(zhuǎn)為Unicode,然后轉(zhuǎn)為GBK String utf8 = new String(t.getBytes( "UTF-8")); //等同于: // String utf8 = new String(t.getBytes( "UTF-8"),Charset.defaultCharset()); System.out.println(utf8); String unicode = new String(utf8.getBytes(),"UTF-8"); //等同于: // String unicode = new String(utf8.getBytes(Charset.defaultCharset()),"UTF-8"); System.out.println(unicode); String gbk = new String(unicode.getBytes("GBK")); //等同于: // String gbk = new String(unicode.getBytes("GBK"),Charset.defaultCharset()); System.out.println(gbk); } }
package com.mkyong; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; public class UTF8ToGBK { public static void main(String[] args) throws Exception { File fileDir = new File("/home/user/Desktop/Unsaved Document 1"); BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream(fileDir), "UTF-8")); String str; while ((str = in.readLine()) != null) { System.out.println(str);// java內(nèi)部只有unicode編碼 所以str是unicode編碼 String str2 = new String(str.getBytes("GBK"), "GBK");// str.getBytes("GBK")是gbk編碼,但是str2是unicode編碼 System.out.println(str2); } in.close(); } }
問(wèn)題的關(guān)鍵是new String(xxx.getBytes("gbk"), "gbk")這句話是什么意思,xxx.getBytes("gbk")得到的數(shù)組編碼是GBK,因此必須必須告訴java:我傳給你的數(shù)組是gbk編碼的,你在轉(zhuǎn)換成你內(nèi)部的編碼的時(shí)候記得要進(jìn)行一些處理,new String(xxx.getBytes("gbk"), "gbk"),這句話第二個(gè)“gbk”是告訴java傳遞給它的是gbk編碼的字符串。
String fullStr = new String(str.getBytes("UTF-8"), "UTF-8");//正常 String fullStr2 = new String(str.getBytes("UTF-8"), "GBK");//不正常,java內(nèi)置的編碼->utf8 被當(dāng)成GBK編碼轉(zhuǎn)換成java內(nèi)置的編碼
看一下jdk文檔是怎么說(shuō)的
public String(byte[] bytes, Charset charset)
Constructs a new String by decoding the specified array of bytes using the specified charset.
那現(xiàn)在的問(wèn)題就是,我怎么在String中持有GBK編碼的東西呢?
String str3 = new String(str.getBytes("GBK"),"ISO-8859-1"); System.out.println(new String(str3.getBytes("ISO-8859-1"),"GBK"));
Java GBK轉(zhuǎn)UTF-8詳解
Java語(yǔ)言是一種編程語(yǔ)言,它是一個(gè)高級(jí)的、面向?qū)ο蟮摹⑵脚_(tái)無(wú)關(guān)的語(yǔ)言。Java主要是用來(lái)構(gòu)建Web應(yīng)用程序,而在Java Web應(yīng)用程序中將字符串編碼變成UTF-8是非常有必要的。在本文中,我們將從多個(gè)方面詳細(xì)探討Java GBK轉(zhuǎn)UTF-8。
一、轉(zhuǎn)換原理
GBK編碼和UTF-8編碼是兩種不同的編碼格式。GBK編碼是一種多字節(jié)編碼方式,每個(gè)漢字占用兩個(gè)字節(jié)存儲(chǔ),因此在文本處理中經(jīng)常遇到GBK編碼轉(zhuǎn)UTF-8編碼的需求。UTF-8編碼是一種字符編碼方式,與ASCII碼兼容,可以支持從U+0000至U+10FFFF范圍內(nèi)的所有字符。
在Java程序中,字符串默認(rèn)的編碼方式是UTF-16編碼,因此需要將GBK編碼轉(zhuǎn)換為UTF-8編碼,主要是為了避免出現(xiàn)亂碼的情況。通過(guò)Java的相關(guān)API來(lái)實(shí)現(xiàn)將GBK編碼轉(zhuǎn)換為UTF-8編碼。
二、具體實(shí)現(xiàn)
1.使用InputStreamReader和OutputStreamWriter轉(zhuǎn)換文件編碼
FileInputStream fileInputStream = new FileInputStream("gbk.txt"); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK"); FileOutputStream fileOutputStream = new FileOutputStream("utf-8.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8"); int length = 0; char[] buffer = new char[1024]; while ((length = inputStreamReader.read(buffer)) != -1) { outputStreamWriter.write(buffer, 0, length); } outputStreamWriter.close(); fileOutputStream.close(); inputStreamReader.close(); fileInputStream.close();
上述代碼中,先使用FileInputStream和InputStreamReader讀取GB2312編碼的文件,然后再使用FileOutputStream和OutputStreamWriter將文件以UTF-8編碼寫入到新的文件中。
2.使用String.getBytes()方法轉(zhuǎn)換字符串編碼
String strGBK = "這是一段GBK編碼的字符串"; byte[] bytes = strGBK.getBytes("GBK"); String strUTF = new String(bytes,"UTF-8"); System.out.println(strUTF);
上述代碼中,我們先定義了一個(gè)字符串strGBK,將其轉(zhuǎn)換成字節(jié)數(shù)組bytes,并指定編碼方式為GBK。接著,通過(guò)String構(gòu)造方法將字節(jié)數(shù)組bytes以UTF-8編碼方式構(gòu)建新的字符串strUTF,并進(jìn)行輸出。
3.使用編碼轉(zhuǎn)換器Charset實(shí)現(xiàn)編碼轉(zhuǎn)換
String strGBK = "這是一段GBK編碼的字符串"; Charset gbkCharset = Charset.forName("GBK"); Charset utf8Charset = Charset.forName("UTF-8"); ByteBuffer byteBuffer = gbkCharset .encode(strGBK); CharBuffer charBuffer = utf8Charset .decode(byteBuffer); System.out.println(charBuffer.toString());
上述代碼中,我們首先定義一個(gè)字符串strGBK,然后通過(guò)Charset的forName方法分別創(chuàng)建GBK編碼和UTF-8編碼的Charset,并使用GBK編碼器將字符串轉(zhuǎn)換成ByteBuffer,再通過(guò)UTF-8解碼器將ByteBuffer轉(zhuǎn)換成CharBuffer,最后輸出轉(zhuǎn)換后的字符串。
三、注意事項(xiàng)
在進(jìn)行GB2312到UTF-8編碼轉(zhuǎn)換時(shí),需要注意以下幾點(diǎn):
1.文本文件編碼格式
在Java程序中,使用FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream等類進(jìn)行文件讀寫時(shí),需要明確文件的編碼格式,否則會(huì)出現(xiàn)亂碼等問(wèn)題。
2.源代碼文件編碼格式
為了保證源代碼文件編碼格式的一致性,最好將所有的源文件均保存為UTF-8編碼,否則可能會(huì)出現(xiàn)編譯錯(cuò)誤等問(wèn)題。
3.字符串編碼格式
在Java程序中,如果需要將字符串從GBK編碼轉(zhuǎn)換成UTF-8編碼,需要使用String的getBytes()方法,同時(shí)指定源編碼和目標(biāo)編碼。
四、總結(jié)
本文詳細(xì)介紹了Java GBK轉(zhuǎn)UTF-8的具體實(shí)現(xiàn)方法,包括文件編碼轉(zhuǎn)換、字符串編碼轉(zhuǎn)換和使用字符集Charset實(shí)現(xiàn)編碼轉(zhuǎn)換。在進(jìn)行GB2312到UTF-8編碼轉(zhuǎn)換時(shí),需要注意文本文件編碼格式、源代碼文件編碼格式和字符串編碼格式的一致性。
到此這篇關(guān)于Java字符轉(zhuǎn)碼之UTF-8互轉(zhuǎn)GBK具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java UTF-8互轉(zhuǎn)GBK內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea maven編譯報(bào)錯(cuò)Java heap space的解決方法
這篇文章主要為大家詳細(xì)介紹了idea maven編譯報(bào)錯(cuò)Java heap space的相關(guān)解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟
這篇文章主要介紹了SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級(jí))
壓縮文件在生活中經(jīng)常能用到,在Java中提供了壓縮和解壓縮文件的功能,本文主要介紹了Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級(jí)),感興趣的可以了解一下2024-03-03Java實(shí)現(xiàn)的Base64加密算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)的Base64加密算法,結(jié)合實(shí)例形式分析了Java實(shí)現(xiàn)的base64編碼轉(zhuǎn)換相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下2018-04-04SpringBoot整合FastDFS中間件實(shí)現(xiàn)文件分布管理
FastDFS是一個(gè)開源的輕量級(jí)分布式文件系統(tǒng),它對(duì)文件進(jìn)行管理,功能包括:文件存儲(chǔ)、文件同步、文件上傳、文件下載等,解決了大容量存儲(chǔ)和負(fù)載均衡的問(wèn)題,本文介紹了SpringBoot整合FastDFS中間件實(shí)現(xiàn)文件分布管理,需要的朋友可以參考下2024-08-08SpringBoot開發(fā)案例之配置Druid數(shù)據(jù)庫(kù)連接池的示例
本篇文章主要介紹了SpringBoot開發(fā)案例之配置Druid數(shù)據(jù)庫(kù)連接池的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Struts2實(shí)現(xiàn)生成動(dòng)態(tài)驗(yàn)證碼并驗(yàn)證實(shí)例代碼
這篇文章主要介紹了Struts2實(shí)現(xiàn)生成動(dòng)態(tài)驗(yàn)證碼并驗(yàn)證實(shí)例代碼的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Java實(shí)現(xiàn)控制臺(tái)輸出兩點(diǎn)間距離
這篇文章主要介紹了Java實(shí)現(xiàn)控制臺(tái)輸出兩點(diǎn)間距離,涉及了部分編程坐標(biāo)的問(wèn)題,具有一定參考價(jià)值,需要的朋友可以了解下2017-09-09