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 !=  nulltry { 
                                reader.close(); 
                        }  catch (IOException e) { 
                                flag =  false
                                 throw  new RuntimeException(e); 
                        }  finally { 
                                 if (writer !=  nulltry { 
                                        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 !=  nulltry { 
                                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 !=  nulltry { 
                                writer.close(); 
                        }  catch (IOException e) { 
                                log.error( "关闭输出流发生异常!", e); 
                                 throw  new RuntimeException(e); 
                        } 
                } 
                 return flag; 
        } 
}
 


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/236392,如需转载请自行联系原作者
相关文章
|
2月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
85 4
|
2月前
|
Java
Java实现随机生成某个省某个市的身份证号?如何编码?
【10月更文挑战第18天】Java实现随机生成某个省某个市的身份证号?如何编码?
136 5
|
2月前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
65 2
|
4月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
123 0
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
86 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3月前
|
存储 移动开发 Java
java核心之字符串与编码
java核心之字符串与编码
25 2
|
4月前
|
Java
Java系列之:字符串UTF-8 编码格式转换位 UTF-32 【生僻字截取问题】
这篇文章讨论了在Java中处理包含生僻字的字符串时可能遇到的问题,并提供了一种解决方法:将字符串的编码格式从UTF-8转换为UTF-32,以确保每个字符都占用固定的字节数,从而避免在截取操作中破坏字符,示例代码展示了如何进行编码转换和字符串截取。
|
4月前
|
存储 安全 Java
"Java编码魔法:揭秘图片与文件的Base64神秘转换术,让数据在指尖跳跃!"
【8月更文挑战第16天】Base64编码在Java开发中常用于将二进制数据如图片转换为ASCII字符串以便传输。编码使用64个字符及等号填充,每3字节数据编码为4个字符。Java利用`java.util.Base64`类实现此功能:读取图片或文件为字节数组后进行编码。解码时将Base64字符串还原为字节数组并写入文件。需注意编码效率降低、不提供安全性及特殊字符兼容性等问题。掌握这些技巧有助于解决Web开发中的数据传输需求。
100 4
|
4月前
|
Java
Java——编码GBK的不可映射字符
Java——编码GBK的不可映射字符
46 1
|
4月前
|
Java PHP 开发者
PHP中的异常处理:Java常见的编码方式
在PHP开发中,掌握异常处理至关重要,它有助于预见并管理运行时错误,避免用户体验受损或数据丢失。本文介绍PHP异常处理的基本概念与实践,包括try-catch语句的使用,以及如何通过抛出和捕获异常来增强代码的健壮性和可靠性。通过示例展示如何避免常见错误,如除数为零的情况,并探讨多catch块和finally语句的高级用法,帮助开发者提升程序稳定性与可维护性。[总字符数:238]
31 0