`

Java字符集编码与转码

阅读更多
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;
        }
}
分享到:
评论

相关推荐

    java字符串编码转换

    ### Java字符串编码转换详解 #### 一、Java 字符串编码转换基础 在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web...

    前后台字符集转码.txt

    前端使用`encodeURI()`进行编码,而后端使用`URLDecoder.decode()`进行解码,两者之间必须保持字符集编码的一致性。此外,还应该注意编码与解码的过程是否完整,避免出现部分字符未被正确处理的情况。 总之,字符集...

    使用 Java 对 Linux 下文件编码格式进行批量转换源代码

    将 字符集编码格式为 GB2312 的文件 test0.java,test1.java,test2.java 放在 /home/defonds/tmp/test 目录下(test0.java,test1.java,test2.java 作者也可以自行随意创建。如何查看 test0.java 的字符集编码格式...

    关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    ### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...

    java读写excel包括utf8转码为可识别汉字gbk

    java读写excel包括utf8转码为可识别汉字gbk,jxl方式读取excel,生成一个新的excel

    java转码

    6. `StandardCharsets` 类:Java提供了一个内置枚举类`StandardCharsets`,其中包含了常见的字符集常量,如`UTF_8`,`ISO_8859_1`等,方便我们在编码转换时使用。 7. 使用第三方库:在某些复杂情况下,如处理多国...

    jvm字符转码

    在Java虚拟机(JVM)中,字符转码是一个关键的概念,它涉及到字符串的内部表示以及与不同编码格式之间的转换。让我们深入探讨一下这个主题。 首先,了解字符集的基础知识至关重要。字符集,如ASCII、ISO-8859-1、GB...

    java 写的字符编码转换工具(附带源码)

    1. **Charset类**:Java的`java.nio.charset`包中的`Charset`类是字符编码的核心类,它可以用于获取所有可用的字符集,并进行字符编码和解码操作。例如,`Charset.forName("UTF-8")`可以获取UTF-8编码。 2. **...

    Java 程序转码(UTF-8)

    字符编码是计算机用来表示字符集的一种方式。常见的字符编码有ASCII、GB2312、GBK、UTF-8等。其中,UTF-8是一种变长字符编码,用于Unicode编码标准,兼容ASCII,并且能够高效地存储大多数非英文字符。 ##### 2. UTF...

    java转码工具

    Java转码工具是一种基于Java语言开发的实用程序...总的来说,Java转码工具是处理编码问题的有效工具,尤其对于处理中文字符集的转换,它可以帮助开发者和普通用户在不同编码格式间轻松转换,确保数据的准确性和一致性。

    java转码工具类

    在Java开发中,经常会遇到不同编码格式的文件处理问题,特别是在处理国际化应用时,字符集的兼容性尤为重要。本篇文章介绍了一个Java批量转换文件编码的工具类——`FileUtilsExt`,它能够帮助开发者轻松实现文件编码...

    java的api中文转码示例

    在Java编程中,处理中文字符编码是一个常见的任务,特别是在与URL交互、文件读写或网络通信等场景。本文将深入探讨如何使用Java API进行中文转码,以方便URL传参和其他应用。 首先,中文字符在计算机中存储时通常...

    java转码代码

    乱码是由于文件或数据流在处理时使用了错误的字符集导致的。在这个场景下,"java转码代码"指的是用于解决Java程序中遇到的乱码问题的代码段,而"ISOtoGbk.java"可能是一个源代码文件,专门用于将遵循ISO-8859-1编码...

    获取文件编码格式与文件转码

    - **编程实现**:例如在Android中,可以自定义函数读取文件部分内容,然后通过比较各种编码方式解码后的字符集是否符合预期来推断编码。 2. **文件转码** - **使用内置API**:在Java和Android中,`java.nio....

    unicode 转码器 编码转换

    在计算机科学领域,编码转换是处理字符集与不同编码方式之间转换的重要操作。"Unicode转码器"就是一种工具,用于将数据从一种编码格式转换为Unicode编码,以确保跨平台和跨语言的文本一致性。Unicode是一种国际标准...

    编码转码器

    3. GB2312码:全称为“国标汉字编码”,是中国大陆的简体中文字符集,包含了6763个常用汉字,是GBK码和GB18030码的基础。 4. BIG-5码:主要应用于繁体中文,特别是在台湾和香港地区,它是一个双字节编码系统,包含...

    批量转化文件编码工具(附Java源码)

    文件编码在信息技术领域中扮演着至关重要的角色,不同的编码方式决定了字符集的表示方式和兼容性。本项目是一个批量文件转码工具,专为解决在处理大量文本文件时遇到的不同编码格式之间的转换问题。该工具由Java编程...

    java字符转码的三种方法总结及实例

    在Java编程语言中,字符转码是一个常见的任务,特别是在处理多语言文本或与不同编码格式的文件交互时。本文将详细讲解Java中字符转码的三种主要方法,并通过实例进行说明。 1. **使用`String`类的构造器和`getBytes...

    cxf2.7.18编码GBK的不可映射字符问题

    - 如果是通过HTTP请求发送XML或JSON数据,确保数据在发送前已被正确转码为指定的字符集。 在实际开发中,为了保证兼容性和避免类似问题,通常推荐使用更通用的UTF-8编码。同时,确保所有涉及字符串操作的地方都...

    简单的UTF-8与GBK之间相互转码工具

    而UTF-8是一种可变长度的Unicode编码,能容纳世界上几乎所有的字符集。 GBK编码是中国大陆广泛使用的编码标准,它基于GB2312,增加了许多额外的字符。UTF-8则是一种国际化的编码标准,它是Unicode的一种实现方式,...

Global site tag (gtag.js) - Google Analytics