java字符轉(zhuǎn)碼:三種方法
轉(zhuǎn)碼成功的前提:解碼后無亂碼
轉(zhuǎn)碼流程:文件(gbk)-->解碼-->編碼--->文件(utf-8)
注:如有問題請(qǐng)留言
下面具體的實(shí)例
方法一:Java.lang.String
1
2
3
4
5
6
7
8
|
//用于解碼的構(gòu)造器: String( byte [] bytes, int offset, int length, String charsetName) String( byte [] bytes, String charsetName) 用于編碼的方法: byte [] getBytes(String charsetName) //使用指定字符集進(jìn)行編碼 byte [] getBytes() //使用系統(tǒng)默認(rèn)字符集進(jìn)行編碼 <br> |
1
2
3
4
5
6
7
8
9
10
|
public void convertionString() throws UnsupportedEncodingException{ String s = "清山" ; byte [] b = s.getBytes( "gbk" ); //編碼 String sa = new String(b, "gbk" ); //解碼:用什么字符集編碼就用什么字符集解碼 System.out.println(sa); b = sa.getBytes( "utf-8" ); //編碼 sa = new String(b, "utf-8" ); //解碼 System.err.println(sa); } |
方法二:java.io.InputStreamReader/OutputStreamWriter:橋轉(zhuǎn)換
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
package com.qingshan.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; /** * <pre> * 使用java.io橋轉(zhuǎn)換:對(duì)文件進(jìn)行轉(zhuǎn)碼 * </pre> * <hr Color="green" ></hr> * 2012 Qingshan Group 版權(quán)所有 * <hr Color="green" ></hr> * @author thetopofqingshan * @version 1.0.0 * @since JDK 1.5 * @date 2012-4-28 */ public class CharsetConvertion { private FileInputStream fis; // 文件輸入流:讀取文件中內(nèi)容 private InputStream is; private InputStreamReader isr; private OutputStream os; private OutputStreamWriter osw; //寫入 private char [] ch = new char [ 1024 ]; public void convertionFile() throws IOException{ is = new FileInputStream( "C:/項(xiàng)目進(jìn)度跟蹤.txt" ); //文件讀取 isr = new InputStreamReader(is, "gbk" ); //解碼 os = new FileOutputStream( "C:/項(xiàng)目進(jìn)度跟蹤_utf-8.txt" ); //文件輸出 osw = new OutputStreamWriter(os, "utf-8" ); //開始編碼 char [] c = new char [ 1024 ]; //緩沖 int length = 0 ; while ( true ){ length = isr.read(c); if (length == - 1 ){ break ; } System.out.println( new String(c, 0 , length)); osw.write(c, 0 , length); osw.flush(); } } public void convertionString() throws UnsupportedEncodingException{ String s = "清山集團(tuán)" ; byte [] b = s.getBytes( "gbk" ); //編碼 String sa = new String(b, "gbk" ); //解碼:用什么字符集編碼就用什么字符集解碼 System.out.println(sa); b = sa.getBytes( "utf-8" ); //編碼 sa = new String(b, "utf-8" ); //解碼 System.err.println(sa); } /** * <pre> * 關(guān)閉所有流 * </pre> * */ public void close(){ if (isr != null ){ try { isr.close(); } catch (IOException e) { e.printStackTrace(); } } if (is != null ){ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (osw != null ){ try { osw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (os != null ){ try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * <pre> * 用io讀取文件內(nèi)容 * </pre> * * @throws IOException * 讀取過程中發(fā)生錯(cuò)誤 * */ /** * <pre> * * </pre> * @param path * @param charset * @throws IOException * */ public void read(String path, String charset) throws IOException { fis = new FileInputStream(path); isr = new InputStreamReader(fis, charset); while (fis.available() > 0 ) { int length = isr.read(ch); System.out.println( new String(ch)); } } public static void main(String[] args) { try { CharsetConvertion cc = new CharsetConvertion(); cc.convertionFile(); cc.convertionString(); cc.close(); } catch (IOException e) { e.printStackTrace(); } } } |
方法三:java.nio.Charset
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
package com.qingshan.nio; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; /** * <pre> * 使用nio中的Charset轉(zhuǎn)換字符:整個(gè)流程是文件讀取-->byte-->解碼(正確)-->編碼--->byte-->寫入文件 * </pre> * <hr Color="green" > * </hr> * 2012 Qingshan Group 版權(quán)所有 * <hr Color="green" > * </hr> * * @author thetopofqingshan * @version 1.0.0 * @since JDK 1.5 * @date 2012-4-27 */ public class CharsetConvertion { private FileInputStream fis; // 文件輸入流:讀取文件中內(nèi)容 private FileChannel in; // 文件通道:雙向,流從中而過 private FileChannel out; // 文件通道:雙向,流從中而過 private FileOutputStream fos; // 文件輸出流:向文件中寫入內(nèi)容 private ByteBuffer b = ByteBuffer.allocate( 1024 * 3 ); // 設(shè)置緩存區(qū)的大小 private Charset inSet; // 解碼字符集 private Charset outSet; // 編碼字符集 private CharsetDecoder de; // 解碼器 private CharsetEncoder en; // 編碼器 private CharBuffer convertion; // 中間的字符數(shù)據(jù) private ByteBuffer temp = ByteBuffer.allocate( 1024 * 3 ); // 設(shè)置緩存區(qū)的大小:臨時(shí) private byte [] by = new byte [ 1024 ]; private InputStreamReader isr; private char [] ch = new char [ 1024 ]; /** * <pre> * * </pre> * * @param src * @param dest * @throws IOException * */ public void convertionFile_nio(String src, String dest) throws IOException { fis = new FileInputStream(src); in = fis.getChannel(); fos = new FileOutputStream(dest); out = fos.getChannel(); inSet = Charset.forName( "gbk" ); outSet = Charset.forName( "utf-8" ); de = inSet.newDecoder(); en = outSet.newEncoder(); while (fis.available() > 0 ) { b.clear(); // 清除標(biāo)記 in.read(b); // 將文件內(nèi)容讀入到緩沖區(qū)內(nèi):將標(biāo)記位置從0-b.capacity(), // 讀取完畢標(biāo)記在0-b.capacity()之間 b.flip(); // 調(diào)節(jié)標(biāo)記,下次讀取從該位置讀起 convertion = de.decode(b); // 開始編碼 temp.clear(); // 清除標(biāo)記 temp = en.encode(convertion); b.flip(); // 將標(biāo)記移到緩沖區(qū)的開始,并保存其中所有的數(shù)據(jù):將標(biāo)記移到開始0 out.write(temp); // 將緩沖區(qū)內(nèi)的內(nèi)容寫入文件中:從標(biāo)記處開始取出數(shù)據(jù) } } /** * <pre> * 測(cè)試轉(zhuǎn)碼是否成功, 指定字符集讀取文件 * </pre> * * @param src * 被復(fù)制文件全路徑 * @param charset 解碼字符集 * * @throws IOException 讀取過程中的發(fā)生的異常 * */ public void read(String path, String charset) throws IOException { fis = new FileInputStream(path); isr = new InputStreamReader(fis, charset); while (fis.available() > 0 ) { int length = isr.read(ch); System.out.println( new String(ch)); } } /** * <pre> * 關(guān)閉所有流或通道 * </pre> * */ public void close() { try { if (in != null ) { in.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (out != null ) { out.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (fis != null ) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (fos != null ) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { CharsetConvertion n = new CharsetConvertion(); try { n.convertionFile_nio( "C:/項(xiàng)目進(jìn)度跟蹤.txt" , "C:/nio_write.txt" ); // n.read("C:/nio_write.txt", "utf-8");// 正確 // n.read("C:/nio_write.txt", "gbk");//亂碼 } catch (IOException e) { e.printStackTrace(); } finally { n.close(); } } } |
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
原文鏈接:http://blog.csdn.net/zhengqiqiqinqin/article/details/12621201