本文目錄一覽:
- 1、Java中如何把GBK編碼的字元串轉成utf-8編碼
- 2、java 怎麼gbk轉碼utf-8
- 3、java中GBK編碼格式轉成UTF8,用一段方法實現怎麼做
- 4、java怎麼將gbk編碼的文件轉成utf-8編碼
Java中如何把GBK編碼的字元串轉成utf-8編碼
我先解釋一下我對你的問題的理解
:
你的問題有點籠統
可以這麼理解兩個意思
:
一
,你是想吧一個gbk編碼的字元串用utf-8格式來編碼
String
s
=
new
String
(“全國”.getBytes(“GBK”),”GBK”);
雖然這個時候的s是GBK編碼的
但是s還是中文字元的
所以
上面這位同胞用
new(s.getBytes(“GBK”),”UTF-8″)的方式肯定是錯的
應該用
String
s1
=
new
String
(s.getBytes(“UTF-8″),”UTF-8”)
這樣s1就是UTF-8編碼的字元串了
二,如果是遇見亂碼問題
比如
String
s
=
new
String
(“全國”.getBytes(“GBK”),”GBK”);
這樣的s就是gbk編碼的
現在你要把GBK格式的編碼用UTF-8去編碼
肯定就會出現亂碼
String
s2
=
new
String(s.getBytes(“GBK”),”UTF-8″);
這個s2肯定是亂碼的
而且這樣就根本解不出來了
系統出現的亂碼顯示的時候才會出現編碼錯誤
所以
一般出現亂碼
只要把輸入流換個編碼解析一下就ok了
還有什麼不明白
可以問我
java 怎麼gbk轉碼utf-8
方法一:
思路:先轉為Unicode,然後轉為GBK
String utf8 = new String(t.getBytes( “UTF-8”));
System.out.println(utf8);
String unicode = new String(utf8.getBytes(),”UTF-8″);
System.out.println(unicode);
String gbk = new String(unicode.getBytes(“GBK”));
System.out.println(gbk);
方法二:
public static void main(String[] args) {
String str=”字元串編碼轉換”;
try {
byte[] temp=str.getBytes(“utf-8”);//這裡寫原編碼方式
byte[] newtemp=new String(temp,”utf-8″).getBytes(“gbk”);//這裡寫轉換後的編碼方式
String newStr=new String(newtemp,”gbk”);//這裡寫轉換後的編碼方式
System.out.println(newStr);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
java中GBK編碼格式轉成UTF8,用一段方法實現怎麼做
首先明確幾點:
unicode是一種「編碼」,所謂編碼就是一個編號(數字)到字元的一種映射關係,就僅僅是一種一對一的映射而已,可以理解成一個很大的對應表格
GBK、UTF-8是一種「編碼格式」,是用來序列化或存儲1中提到的那個「編號(數字)」的一種「格式」;GBK和UTF-8都是用來序列化或存儲unicode編碼的數據的,但是分別是2種不同的格式; 他們倆除了格式不一樣之外,他們所關心的unicode編碼範圍也不一樣,utf-8考慮了很多種不同國家的字元,涵蓋整個unicode碼錶,所以其存儲一個字元的編碼的時候,使用的位元組長度也從1位元組到4位元組不等;而GBK只考慮中文——在unicode中的一小部分——的字元,的編碼,所以它算好了只要2個位元組就能涵蓋到絕大多數常用中文(2個位元組能表示6w多種字元),所以它存儲一個字元的時候,所用的位元組長度是固定的;
上述2個概念不懂的請馬上google,下面不再贅述;我下面說說這個問題本身…的問題在哪裡
首先java的string使用的編碼是unicode,但是,當string存在於內存中時(也就是當程序運行時、你在代碼中用string類型的引用對它進行操作時、也就是string沒有被存在文件中且也沒有在網路中傳輸(序列化)時),是「只有編碼而沒有編碼格式的」,所以java程序中的任何String對象,說它是gbk還是utf-8都是錯的,gbk和utf-8是編碼格式而不是編碼,String在內存中不需要「編碼格式」(記住編碼格式是在存文件或序列化的時候使用的), 它只是一個unicode的字元串而已
所以java裡面String是不帶編碼格式的,而String.toByteArray(charsetName)得到的byteArray是帶編碼格式的,格式就是你傳入的’charsetName’,我們不妨把toByteArray的這個過程叫做「編碼」;另外,new String(byte[], charsetName)是把一個byte數組(帶編碼格式)以charsetName指定的編碼格式翻譯為一個不帶編碼格式的String對象,我們不妨把這個過程叫「解碼」
那麼根據我揣測提問者的意圖,可能有2種問法是他真正想問的:
第一,如何把一個被錯誤地當作是gbk格式存儲的utf-8格式的文件裡面讀出來的一段亂碼字元串還原回去(也就是說本來二進位數據是utf-8的,你用gbk來解碼它,得到的字元串是亂碼,現在想要還原回去)
第二種,如何把一個gbk文件轉化為utf-8文件
如果是第一種意圖那就:
public static void main(String… args) throws Throwable {
String errStr = “errStr”;
System.out.println(recover(errStr));
}
public static String recover(String str) throws Throwable {
return new String(str.getBytes(“GBK”), “UTF-8”);
}
其中errStr就是亂碼字元串,按照相反的順序在編碼(用gbk)、解碼(用utf-8)回去,就能得到正確的字元串(其實不保證所有情況均能正確還原,只能說大部分都能,要看你在亂碼過程中是否有數據被丟失)
如果是第二種意圖,那就用InputStream以gbk格式將文件讀到內存里(表示為String),再將這個String以UTF-8編碼寫入目標文件里,具體請參考InputStream/OutputStream的api
java怎麼將gbk編碼的文件轉成utf-8編碼
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
public class gbk2utf8 {
public static void main(String[] args) throws InterruptedException, IOException {
gbk2utf8 tt = new gbk2utf8();
tt.copyAll(“E:\\mine\\GitHub\\mytest\\myJar\\src”, “E:/test”);
}
public void copyAll(String dir,String des) throws IOException{
File parent = new File(dir);
System.err.println(parent.getAbsolutePath());
String[] allFile = parent.list();
for (String string : allFile) {
File file = new File(dir+”/”+string);
if(file.isFile()){
this.copy(file,des);
}else{
File newDes = new File(des+”/”+string);
if(!newDes.exists()) newDes.mkdir();
this.copyAll(dir+”/”+string,des+”/”+string);
}
}
}
public void copy(File file,String des) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file), Charset.forName(“gbk”)));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(des+”/”+file.getName()), Charset.forName(“UTF-8”)));
String lineTxt = null;
while ((lineTxt = br.readLine()) != null) {
bw.write(lineTxt);
bw.newLine();
}
bw.flush();
bw.close();
br.close();
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238422.html