Java处理不同的字符编码流

摘要:
然而,这里的编码通常是不确定的。有些是GBK格式,有些是UTF-8格式,可能还有其他格式的文件。此时,有很多方法可以处理它。现在我将向您介绍一种有效的测试方法。例如,具有BOM格式的UTF-8文件的前三个字节将如下:EFBBBF Unicode文件的前两个字节如下:FFFE GBK文件统一为ANSI文件,通常没有头信息。如果两个文件都是ANSI,一个是日本代码,另一个是GBK,则无法区分它们。

在实际开发中,可能会处理一些文本信息,我们可能使用

BufferedReader bfr = new BufferedReader(new InputStreamReader(bis,encoding));

这样的方式来处理输入流,然后就可以一行一行的处理信息了。

但是,这里的encoding一般都不会确定,有的是GBK格式,有的是UTF-8格式,可能还有其他格式的文件。

这时候,处理的方式很多,现在给大家介绍一种亲测有效的方法。

原理:使用文本文件头部信息,来确定使用哪种字符编码。

比如,UTF-8含BOM格式的文件前三个字节会是这样:EFBBBF

  Unicode文件前两个字节会是这样:FFFE

  GBK这类统一为ANSI文件,这种一般没有头信息,如果两个文件都是ANSI,一个是日语编码,一个是GBK,那这种办法就没有办法区分了。

代码:

  输入:InputStream

      BufferedReader bfr = null;
/*
             * 默认读取方式为GBK编码,先读取前三个字节,看是否为十六进制的“EFBBBF”
             * 如果是,则使用UTF-8方式读取
             * 否则则使用默认GBK方式读取
             */
            BufferedInputStream bis = new BufferedInputStream(is);
            String encoding = "gbk";
            bis.mark(3);
            byte[] bom = new byte[3];
            bis.read(bom);
            bis.reset();
            if(bom[0] == Integer.valueOf("EF",16).byteValue()
                    &&bom[1] == Integer.valueOf("BB",16).byteValue()
                    &&bom[2] == Integer.valueOf("BF",16).byteValue()){
                encoding = "utf-8";
            } else if(bom[0] == Integer.valueOf("FF",16).byteValue()
                    &&bom[1] == Integer.valueOf("FE",16).byteValue()) {
                encoding = "Unicode";
            }
            System.out.println(encoding);
            //正式读取文件开始
            bfr = new BufferedReader(new InputStreamReader(bis,encoding));
      //do somethig

免责声明:文章转载自《Java处理不同的字符编码流》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇XamarinEssentials教程设置首选项Preferences的值_cdecl与_stdcall的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

BASE64编码的图片在网页中的显示问题的解决

BASE64位转码有两种: 一种是图片转为Base64编码,这种编码是直接可以在页面通过<img src='http://t.zoukankan.com/base64编码'/>的方式显示 Base64 在CSS中的使用 .demoImg{ background-image: url("data:image/jpg;base64,/9j/4QMZ...

JSP中文乱码问题的由来以及解决方法

首先明确一点,在计算机中,只有二进制的数据! 一、java_web乱码问题的由来 1.字符集 1.1 ASCII字符集 在早期的计算机系统中,使用的字符非常少,这些字符包括26个英文字母、数字符号和一些常用符号(包括控制符号),对这些字符进行编码,用1个字节就足够了(1个字节可以表示28=256种字符)。然而实际上,表示这些字符,只使用了1个字节的7位,这...

node爬虫爬取中文时乱码问题 | nodejs gb2312、GBK中文乱码解决方法

iconv需要依赖native库,这样一来,在一些不支持native模块安装的虚拟主机和windows平台上,我们还是无法安心处理GBK编码。 老外写了一个通过纯Javascript转换编码的模块 iconv-lite 可以实现window下的转换 ,通过npm可以安装此模块,bufferhelper是一个操作buffer的加强类 首先安装 npm ins...

C++用iconv进行页面字符转换

在对HTML页面进行爬取时,总会遇到一些不同的编码,而我们通常都不会一一对这些编码进行处理,而是集体转换成相同的编码,也易于装入数据库。此时,iconv便成为一个很方便的工具。 iconv 头文件"iconv.h"。iconv命令可以将一种已知的字符集文件转换成另一种已知的字符集文件。 它的作用是在多种国际编码格式之间进行文本内码的转换。 li...

五:HttpServletResponse对象

一、HttpServletResponse对象介绍 HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。查看HttpServletResponse的API,可以看到这些相关的方法。 1.1、负责向客户端(浏览器)发送数据的相关方法    1.2、负责向客户端(浏览器)发送响应头的相...

Javascript中的url编码与解码(详解)

摘要 本文主要针对URI编解码的相关问题做了介绍,对url编码中哪些字符需要编码、为什么需要编码做了详细的说明,并对比分析了Javascript中和编解码相关的几对函数escape / unescape,encodeURI / decodeURI和encodeURIComponent / decodeURIComponent。 预备知识    foo://...