java字符转码:三种方法
?
java字符转码:三种方法转码成功的前提:解码后无乱码
转码流程:文件(gbk)-->解码-->编码--->文件(utf-8)
?
注:如有问题请留言
?
下面具体的实例
?
方法一:java.lang.String
?
用于解码的构造器:String(byte[] bytes, int offset, int length, String charsetName) String(byte[] bytes, String charsetName) 用于编码的方法:byte[] getBytes(String charsetName) //使用指定字符集进行编码 byte[] getBytes() //使用系统默认字符集进行编码
?
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:桥转换
?
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桥转换:对文件进行转码 * </pre> * <hr Color="green" ></hr> * 2012 Qingshan Group 版权所有 * <hr Color="green" ></hr> * @author thetopofqingshan * @version 1.0.0 * @since JDK 1.5 * @date 2012-4-28 */public class CharsetConvertion {private FileInputStream fis;// 文件输入流:读取文件中内容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:/项目进度跟踪.txt");//文件读取isr = new InputStreamReader(is, "gbk");//解码os = new FileOutputStream("C:/项目进度跟踪_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 = "清山集团";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> * 关闭所有流 * </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 blocke.printStackTrace();}}if(osw != null){try {osw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(os != null){try {os.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/** * <pre> * 用io读取文件内容 * </pre> * * @throws IOException * 读取过程中发生错误 * *//** * <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
?
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转换字符:整个流程是文件读取-->byte-->解码(正确)-->编码--->byte-->写入文件 * </pre> * <hr Color="green" > * </hr> * 2012 Qingshan Group 版权所有 * <hr Color="green" > * </hr> * * @author thetopofqingshan * @version 1.0.0 * @since JDK 1.5 * @date 2012-4-27 */public class CharsetConvertion {private FileInputStream fis;// 文件输入流:读取文件中内容private FileChannel in;// 文件通道:双向,流从中而过private FileChannel out;// 文件通道:双向,流从中而过private FileOutputStream fos;// 文件输出流:向文件中写入内容private ByteBuffer b = ByteBuffer.allocate(1024 * 3);// 设置缓存区的大小private Charset inSet;// 解码字符集private Charset outSet;// 编码字符集private CharsetDecoder de;// 解码器private CharsetEncoder en;// 编码器private CharBuffer convertion;// 中间的字符数据private ByteBuffer temp = ByteBuffer.allocate(1024 * 3);// 设置缓存区的大小:临时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();// 清除标记in.read(b); // 将文件内容读入到缓冲区内:将标记位置从0-b.capacity(),// 读取完毕标记在0-b.capacity()之间b.flip();// 调节标记,下次读取从该位置读起convertion = de.decode(b);// 开始编码temp.clear();// 清除标记temp = en.encode(convertion);b.flip(); // 将标记移到缓冲区的开始,并保存其中所有的数据:将标记移到开始0out.write(temp); // 将缓冲区内的内容写入文件中:从标记处开始取出数据}}/** * <pre> * 测试转码是否成功, 指定字符集读取文件 * </pre> * * @param src * 被复制文件全路径 * @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));}}/** * <pre> * 关闭所有流或通道 * </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:/项目进度跟踪.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();}}}?
?
?转载注明原文地址:http://thetopofqingshan.iteye.com/admin/blogs/1502731
?
1 楼 walldr2161 2012-04-28 前提是必须知道 原始数据的字符集吧?如果是由用户上传的,恐怕还是会有隐患的。 2 楼 潘清山 2012-04-28 walldr2161 你好!
这个不必须担心:上传工具中一般有字符过滤器