0
点赞
收藏
分享

微信扫一扫

Java字符集编码与转码


[code]


Java字符集编码与转码

Java字符的class代码总是Unicode字符集的UTF-16编码,运行时内存中的字符串在没有指定编码的时候也总是Unicode编码。

Java编译时候,会将java文件的编码按照指定编码或者(系统默认的)编码转换为Unicode并加载到内存中进行编译。

下面给出一个Java转码工具,没有测试过,呵呵:

package lavasoft.common; 


import org.apache.commons.logging.Log; 

import org.apache.commons.logging.LogFactory; 


import java.io.*; 


/** 

* 转码工具,全面支持文件、字符串的转码 

* 

* @author Administrator 2009-11-29 16:14:21 

*/ 

public class EncodingToolkit { 

 private static Log log = LogFactory.getLog(EncodingToolkit.class); 


 public static void main(String[] args) { 

 String han = "汉"; 



 System.out.println("---------"); 

 } 


 /** 

 * 对字符串重新编码 

 * 

 * @param text 字符串 

 * @param resEncoding 源编码 

 * @param newEncoding 新编码 

 * @return 重新编码后的字符串 

 */ 

 public static String reEncoding(String text, String resEncoding, String newEncoding) { 

 String rs = null; 

 try { 

 rs = new String(text.getBytes(resEncoding), newEncoding); 

 } catch (UnsupportedEncodingException e) { 

 log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码"); 

 throw new RuntimeException(e); 

 } 

 return rs; 

 } 


 /** 

 * 重新编码Unicode字符串 

 * 

 * @param text 源字符串 

 * @param newEncoding 新的编码 

 * @return 指定编码的字符串 

 */ 

 public static String reEncoding(String text, String newEncoding) { 

 String rs = null; 

 try { 

 rs = new String(text.getBytes(), newEncoding); 

 } catch (UnsupportedEncodingException e) { 

 log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + newEncoding); 

 throw new RuntimeException(e); 

 } 

 return rs; 

 } 


 /** 

 * 文本文件重新编码 

 * 

 * @param resFile 源文件 

 * @param resEncoding 源文件编码 

 * @param distFile 目标文件 

 * @param newEncoding 目标文件编码 

 * @return 转码成功时候返回ture,否则false 

 */ 

 public static boolean reEncoding(File resFile, String resEncoding, File distFile, String newEncoding) { 

 boolean flag = true; 

 InputStreamReader reader = null; 

 OutputStreamWriter writer = null; 

 try { 

 reader = new InputStreamReader(new FileInputStream(resFile), resEncoding); 

 writer = new OutputStreamWriter(new FileOutputStream(distFile), newEncoding); 

 char buf[] = new char[1024 * 64]; // 字符缓冲区 

 int len; 

 while ((len = reader.read(buf)) != -1) { 

 writer.write(buf, 0, len); 

 } 

 writer.flush(); 

 writer.close(); 

 reader.close(); 

 } catch (FileNotFoundException e) { 

 flag = false; 

 log.error("没有找到文件,转码发生异常!"); 

 throw new RuntimeException(e); 

 } catch (IOException e) { 

 flag = false; 

 log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!"); 

 throw new RuntimeException(e); 

 } finally { 

 if (reader != null) try { 

 reader.close(); 

 } catch (IOException e) { 

 flag = false; 

 throw new RuntimeException(e); 

 } finally { 

 if (writer != null) try { 

 writer.close(); 

 } catch (IOException e) { 

 flag = false; 

 throw new RuntimeException(e); 

 } 

 } 

 } 

 return flag; 

 } 


 /** 

 * 读取文件为一个Unicode编码的内存字符串,保持文件原有的换行格式 

 * 

 * @param resFile 源文件对象 

 * @param encoding 文件字符集编码 

 * @return 文件内容的Unicode字符串 

 */ 

 public static String file2String(File resFile, String encoding) { 

 StringBuffer sb = new StringBuffer(); 

 try { 

 LineNumberReader reader = new LineNumberReader(new BufferedReader(new InputStreamReader(new FileInputStream(resFile), encoding))); 

 String line; 

 while ((line = reader.readLine()) != null) { 

 sb.append(line).append(System.getProperty("line.separator")); 

 } 

 reader.close(); 

 } catch (UnsupportedEncodingException e) { 

 log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + encoding); 

 throw new RuntimeException(e); 

 } catch (FileNotFoundException e) { 

 log.error("读取文件为一个内存字符串失败,失败原因所给的文件" + resFile + "不存在!"); 

 throw new RuntimeException(e); 

 } catch (IOException e) { 

 log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!"); 

 throw new RuntimeException(e); 

 } 

 return sb.toString(); 

 } 


 /** 

 * 使用指定编码读取输入流为一个内存Unicode字符串,保持文件原有的换行格式 

 * 

 * @param in 输入流 

 * @param encoding 构建字符流时候使用的字符编码 

 * @return Unicode字符串 

 */ 

 public static String stream2String(InputStream in, String encoding) { 

 StringBuffer sb = new StringBuffer(); 

 LineNumberReader reader = null; 

 try { 

 reader = new LineNumberReader(new BufferedReader(new InputStreamReader(in, encoding))); 

 String line; 

 while ((line = reader.readLine()) != null) { 

 sb.append(line).append(System.getProperty("line.separator")); 

 } 

 reader.close(); 

 in.close(); 

 } catch (UnsupportedEncodingException e) { 

 log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + encoding); 

 throw new RuntimeException(e); 

 } catch (IOException e) { 

 log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!"); 

 throw new RuntimeException(e); 

 } finally { 

 if (in != null) try { 

 in.close(); 

 } catch (IOException e) { 

 log.error("关闭输入流发生异常!", e); 

 throw new RuntimeException(e); 

 } 

 } 

 return sb.toString(); 

 } 


 /** 

 * 字符串保存为制定编码的文本文件 

 * 

 * @param text 字符串 

 * @param distFile 目标文件 

 * @param encoding 目标文件的编码 

 * @return 转换成功时候返回ture,否则false 

 */ 

 public static boolean string2TextFile(String text, File distFile, String encoding) { 

 boolean flag = true; 

 if (!distFile.getParentFile().exists()) distFile.getParentFile().mkdirs(); 

 OutputStreamWriter writer = null; 

 try { 

 writer = new OutputStreamWriter(new FileOutputStream(distFile), encoding); 

 writer.write(text); 

 writer.close(); 

 } catch (IOException e) { 

 flag = false; 

 log.error("将字符串写入文件发生异常!"); 

 throw new RuntimeException(e); 

 } finally { 

 if (writer != null) try { 

 writer.close(); 

 } catch (IOException e) { 

 log.error("关闭输出流发生异常!", e); 

 throw new RuntimeException(e); 

 } 

 } 

 return flag; 

 } 

} 


[/code]

举报

相关推荐

0 条评论