java字符转码的三种方法总结及实例
java字符转码:三种方法
转码成功的前提:解码后无乱码
转码流程:文件(gbk)-->解码-->编码--->文件(utf-8)
注:如有问题请留言
下面具体的实例
方法一:Java.lang.String
//用于解码的构造器: String(byte[]bytes,intoffset,intlength,StringcharsetName) String(byte[]bytes,StringcharsetName) 用于编码的方法: byte[]getBytes(StringcharsetName)//使用指定字符集进行编码 byte[]getBytes()//使用系统默认字符集进行编码
publicvoidconvertionString()throwsUnsupportedEncodingException{ Strings="清山"; byte[]b=s.getBytes("gbk");//编码 Stringsa=newString(b,"gbk");//解码:用什么字符集编码就用什么字符集解码 System.out.println(sa); b=sa.getBytes("utf-8");//编码 sa=newString(b,"utf-8");//解码 System.err.println(sa); }
方法二:java.io.InputStreamReader/OutputStreamWriter:桥转换
packagecom.qingshan.io; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.io.OutputStream; importjava.io.OutputStreamWriter; importjava.io.UnsupportedEncodingException; /** **使用java.io桥转换:对文件进行转码 ***2012QingshanGroup版权所有 * *@authorthetopofqingshan *@version1.0.0 *@sinceJDK1.5 *@date2012-4-28 */ publicclassCharsetConvertion{ privateFileInputStreamfis;//文件输入流:读取文件中内容 privateInputStreamis; privateInputStreamReaderisr; privateOutputStreamos; privateOutputStreamWriterosw;//写入 privatechar[]ch=newchar[1024]; publicvoidconvertionFile()throwsIOException{ is=newFileInputStream("C:/项目进度跟踪.txt");//文件读取 isr=newInputStreamReader(is,"gbk");//解码 os=newFileOutputStream("C:/项目进度跟踪_utf-8.txt");//文件输出 osw=newOutputStreamWriter(os,"utf-8");//开始编码 char[]c=newchar[1024];//缓冲 intlength=0; while(true){ length=isr.read(c); if(length==-1){ break; } System.out.println(newString(c,0,length)); osw.write(c,0,length); osw.flush(); } } publicvoidconvertionString()throwsUnsupportedEncodingException{ Strings="清山集团"; byte[]b=s.getBytes("gbk");//编码 Stringsa=newString(b,"gbk");//解码:用什么字符集编码就用什么字符集解码 System.out.println(sa); b=sa.getBytes("utf-8");//编码 sa=newString(b,"utf-8");//解码 System.err.println(sa); } /** * *关闭所有流 ** */ publicvoidclose(){ if(isr!=null){ try{ isr.close(); }catch(IOExceptione){ e.printStackTrace(); } } if(is!=null){ try{ is.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } if(osw!=null){ try{ osw.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } if(os!=null){ try{ os.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } /** **用io读取文件内容 ** *@throwsIOException *读取过程中发生错误 * */ /** ** **@parampath *@paramcharset *@throwsIOException * */ publicvoidread(Stringpath,Stringcharset)throwsIOException{ fis=newFileInputStream(path); isr=newInputStreamReader(fis,charset); while(fis.available()>0){ intlength=isr.read(ch); System.out.println(newString(ch)); } } publicstaticvoidmain(String[]args){ try{ CharsetConvertioncc=newCharsetConvertion(); cc.convertionFile(); cc.convertionString(); cc.close(); }catch(IOExceptione){ e.printStackTrace(); } } }
方法三:java.nio.Charset
packagecom.qingshan.nio; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStreamReader; importjava.nio.ByteBuffer; importjava.nio.CharBuffer; importjava.nio.channels.FileChannel; importjava.nio.charset.Charset; importjava.nio.charset.CharsetDecoder; importjava.nio.charset.CharsetEncoder; /** **使用nio中的Charset转换字符:整个流程是文件读取-->byte-->解码(正确)-->编码--->byte-->写入文件 *** *2012QingshanGroup版权所有 * * * *@authorthetopofqingshan *@version1.0.0 *@sinceJDK1.5 *@date2012-4-27 */ publicclassCharsetConvertion{ privateFileInputStreamfis;//文件输入流:读取文件中内容 privateFileChannelin;//文件通道:双向,流从中而过 privateFileChannelout;//文件通道:双向,流从中而过 privateFileOutputStreamfos;//文件输出流:向文件中写入内容 privateByteBufferb=ByteBuffer.allocate(1024*3);//设置缓存区的大小 privateCharsetinSet;//解码字符集 privateCharsetoutSet;//编码字符集 privateCharsetDecoderde;//解码器 privateCharsetEncoderen;//编码器 privateCharBufferconvertion;//中间的字符数据 privateByteBuffertemp=ByteBuffer.allocate(1024*3);//设置缓存区的大小:临时 privatebyte[]by=newbyte[1024]; privateInputStreamReaderisr; privatechar[]ch=newchar[1024]; /** * * ** *@paramsrc *@paramdest *@throwsIOException * */ publicvoidconvertionFile_nio(Stringsrc,Stringdest)throwsIOException{ fis=newFileInputStream(src); in=fis.getChannel(); fos=newFileOutputStream(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();//将标记移到缓冲区的开始,并保存其中所有的数据:将标记移到开始0 out.write(temp);//将缓冲区内的内容写入文件中:从标记处开始取出数据 } } /** **测试转码是否成功,指定字符集读取文件 ** *@paramsrc *被复制文件全路径 *@paramcharset解码字符集 * *@throwsIOException读取过程中的发生的异常 * */ publicvoidread(Stringpath,Stringcharset)throwsIOException{ fis=newFileInputStream(path); isr=newInputStreamReader(fis,charset); while(fis.available()>0){ intlength=isr.read(ch); System.out.println(newString(ch)); } } /** **关闭所有流或通道 ** */ publicvoidclose(){ try{ if(in!=null){ in.close(); } }catch(IOExceptione){ e.printStackTrace(); } try{ if(out!=null){ out.close(); } }catch(IOExceptione){ e.printStackTrace(); } try{ if(fis!=null){ fis.close(); } }catch(IOExceptione){ e.printStackTrace(); } try{ if(fos!=null){ fos.close(); } }catch(IOExceptione){ e.printStackTrace(); } } publicstaticvoidmain(String[]args){ CharsetConvertionn=newCharsetConvertion(); 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(IOExceptione){ e.printStackTrace(); }finally{ n.close(); } } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!