java字符集与编码问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java字符集与编码问题

java字符集与编码问题

 2011/12/29 17:28:08  xchyoshiki  http://xchyoshiki.iteye.com  我要评论(0)
  • 摘要:没想到自己的第一篇javaeye博客就是让人头痛的java字符集转码问题,下面是我个人的一些认识与网上收集的代码。在java中String在JVM里是unicode的,任何byte[]到String以及String到byte[]都涉及到字符集编码转换。基本规则是:从byte[]到String就是按某一个编码后的字节数组转换为unicode的字符串,从String到byte[]是将unicode的字符串编码为唯一特定字符集编码后的字节数组。也就是说,Java编译时候
  • 标签:Java 问题

? ? 没想到自己的第一篇javaeye博客就是让人头痛的java字符集转码问题,下面是我个人的一些认识与网上收集的代码。在java中String在JVM里是unicode的,任何byte[]到String以及String到byte[]都涉及到字符集编码转换。基本规则是:

从byte[] 到String就是按某一个编码后的字节数组转换为unicode的字符串,从String到 byte[]是将unicode的字符串编码为唯一特定字符集编码后的字节数组。也就是说,Java编译时候,会将java文件的编码按照指定编码或者系统默认的编码转换为Unicode并加载到内存中进行编译。

public String(byte[] bytes)   

?
这个方法就是完成将bytes[]转码为unicode的String。
使用的是jvm默认的字符集编码。
如果用户指定某一个charsetName,可以是UTF-8,GBK之类的。

public String(byte[] bytes, String charsetName)

?
两者都是完成specCharset到unicode的过程,而不是说改变编码格式为charsetName指定的字符集编码

同理

public byte[] getBytes()  

?

public byte[] getBytes(String charsetName)  

?
这两个方法就是完成从unicode到指定字符集编码的“转码”过程。

?

?

?

?

?

在浏览器中,http请求的parameter到servlet里后,应用服务器已经自动完成了new String(parameterBytes,browserSpecCharset)这个过程。

即,自动用页面设置的charset转码parameterBytes字节数组为unicode的字符串。

?

下面是网上找的一个转码器的例子,经测试比较好用,大家可以自己试试

?

?

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; 
        } 
}
?

?

?

发表评论
用户名: 匿名