Java处理不同的字符编码流

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

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
时间: 2024-12-16 08:21:08

Java处理不同的字符编码流的相关文章

java中的常用字符编码ASCII、Unicode和UTF-8

首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今. ASCI

Java工具类-设置字符编码

package common; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResp

JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧! 一.打印流PrintWriter 打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件 该流提供了打印方法,可以将各种数据类型原样打印 file对象

Java IO流 序列列一:字符编码

1. 字符编码 先来看一下不同的字符编码 String s = "爪哇ABC"; 1.1 utf-8编码 utf8编码:中文占用3个字节,英文占用1个字节 byte[] bytes = s.getBytes("utf-8"); for(byte b : bytes){ //把字节(转换成了int)以16字节的方式显示 System.out.print(Integer.toHexString(b & 0xff) + "  "); } Sys

java服务器与c#客户端的字符编码问题

在服务器与客户端交互时,有时候服务器与客户端并不是拿同一种编程语言写的,这时候需要注意字符编码转换的问题.以java服务器和c#客户端为例,此时把c#端接收到的数据用GBK编码表示.  Encoding encoding = Encoding.GetEncoding("GBK");        //定义GBK编码            returnMsg = encoding.GetString(memStream.GetBuffer(), 0, memStream.GetBuffe

Java IO4:字符编码

前言 字符编码,这本不属于IO的内容,但字节流之后写的应该是字符流,既然是字符流, 那就涉及一个"字符编码的"问题,考虑到字符编码不仅仅是在IO这块,Java中很多场景都涉及到这个概念,因此这边文章就专门详细写一下字符编码,具体 的网上有很多,但本文目的是尽量讲清楚各种编码方式的作用,个人认为,不求.也没有必要对字符编码理解地多么深入. 字符集和字符编码 第一个概念就是字符集和字符编码之间的区别: 1.字符集(charset) 字符集指的是一个系统支持的所有抽象字符的集合.字符是各种文

JAVA基础——字符编码

字符编码 一.概述 InputStreamReader OutputStreamWriter 字符转换流是字符流与字节流转换的桥梁,同时加入了编码转换. 二.编码表的由来 计算机只能识别二进制数据,早期由来是电信号: 为了方便应用计算机,识别各个国家的文字: 就将各个国家的文字用数字来表示,并一一对应,形成一张表,这就是编码表. 三.常见的编码表 注意: 1.Java语言char类型使用的是Unicode 2.UTF-8每一个字节的开头都加有标识头,加完后很容易区分.UTF-8中汉字用3个字节表

如何使用Java代码获取文件、文件流或字符串的编码方式

今天通过网络资源研究了一下如何使用Java代码获取文件.文件流或字符串的编码方式,现将代码与大家分享: package com.ghj.packageoftool; import info.monitorenter.cpdetector.io.ASCIIDetector; import info.monitorenter.cpdetector.io.ByteOrderMarkDetector; import info.monitorenter.cpdetector.io.CodepageDete