java UTF-8 和 UTF-8 without BOM工具处理类

标签: java utf utf | 发表时间:2014-08-27 23:52 | 作者:shefron
出处:http://blog.csdn.net
package org.shefron.fc.utfwithbom;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;

public class UTFFileHandler {

	/**
	 *
	 * @param file the filePath
	 * @return the FileInputStream
	 * @throws Exception
	 */
	public static InputStream getInputStream(String file) throws Exception{
		FileInputStream fis = null;
		try{
			fis = new FileInputStream(file);
		}catch(Exception e){
			System.out.println(e.getMessage());
			throw new Exception("IO Stream Error!");
		}
		return fis;

	}

	/**
	 *
	 * @param file the filePath
	 * @param enc  the default encoding
	 * @return the UTFFileHandler.UnicodeInputStream
	 * @throws Exception
	 */
	public static InputStream getInputStreamWithoutBom(String file,String enc) throws Exception{

		UnicodeInputStream stream = null;
		try{
			FileInputStream fis = new FileInputStream(file);
			stream = new UnicodeInputStream(fis,null);
			System.out.println("encoding:"+stream.getEncoding() );
		}catch(Exception e){
			System.out.println(e.getMessage());
			throw new Exception("IO Stream Error!");
		}
		return stream;

	}

	/**
	 * This inputstream will recognize unicode BOM marks and will skip bytes if
	 * getEncoding() method is called before any of the read(...) methods.
	 *
	 * Usage pattern: String enc = "ISO-8859-1"; // or NULL to use systemdefault
	 * FileInputStream fis = new FileInputStream(file); UnicodeInputStream uin = new
	 * UnicodeInputStream(fis, enc); enc = uin.getEncoding(); // check and skip
	 * possible BOM bytes InputStreamReader in; if (enc == null) in = new
	 * InputStreamReader(uin); else in = new InputStreamReader(uin, enc);
	 */
	public static class UnicodeInputStream extends InputStream {
	    PushbackInputStream internalIn;
	    boolean isInited = false;
	    String defaultEnc;
	    String encoding;

	    private static final int BOM_SIZE = 4;

	    public UnicodeInputStream(InputStream in, String defaultEnc) {
	        internalIn = new PushbackInputStream(in, BOM_SIZE);
	        this.defaultEnc = defaultEnc;
	    }

	    public String getDefaultEncoding() {
	        return defaultEnc;
	    }

	    public String getEncoding() {
	        if (!isInited) {
	            try {
	                init();
	            } catch (IOException ex) {
	                IllegalStateException ise = new IllegalStateException(
	                        "Init method failed.");
	                ise.initCause(ise);
	                throw ise;
	            }
	        }
	        return encoding;
	    }

	    /**
	     * Read-ahead four bytes and check for BOM marks. Extra bytes are unread
	     * back to the stream, only BOM bytes are skipped.
	     */
	    protected void init() throws IOException {
	        if (isInited)
	            return;

	        byte bom[] = new byte[BOM_SIZE];
	        int n, unread;
	        n = internalIn.read(bom, 0, bom.length);

	        if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00)
	                && (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
	            encoding = "UTF-32BE";
	            unread = n - 4;
	        } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)
	                && (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
	            encoding = "UTF-32LE";
	            unread = n - 4;
	        } else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB)
	                && (bom[2] == (byte) 0xBF)) {
	            encoding = "UTF-8";
	            unread = n - 3;
	        } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
	            encoding = "UTF-16BE";
	            unread = n - 2;
	        } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
	            encoding = "UTF-16LE";
	            unread = n - 2;
	        } else {
	            // Unicode BOM mark not found, unread all bytes
	            encoding = defaultEnc;
	            unread = n;
	        }
	        // System.out.println("read=" + n + ", unread=" + unread);

	        if (unread > 0)
	            internalIn.unread(bom, (n - unread), unread);

	        isInited = true;
	    }

	    public void close() throws IOException {
	        // init();
//	        isInited = true;
	        internalIn.close();
	    }

	    public int read() throws IOException {
	        // init();
//	        isInited = true;
	        return internalIn.read();
	    }
	}

}


 

作者:shefron 发表于2014-8-27 15:52:22 原文链接
阅读:6 评论:0 查看评论

相关 [java utf utf] 推荐:

java UTF-8 和 UTF-8 without BOM工具处理类

- - CSDN博客推荐文章
作者:shefron 发表于2014-8-27 15:52:22 原文链接. 阅读:6 评论:0 查看评论.

扯谈下UTF-8

- - CSDN博客推荐文章
本来想翻译这篇文章的(作者是utf-8编码,golang发明者之一):. 一则翻译起来很痛苦,二则觉得这篇文章有些地方可能说得不是太明白,所以结合其它的一些东东扯谈下utf-8. Unicode就是为每一个字符(各种语言的各种字符)分配一个数字. 所以它实际上是一个表,记录了字符和数字的对应关系. 比如汉字“你”,对应的数字是20320,16进制是4F60.

JAVA ,SSH中文及其乱码问题的解决 6大配置点 使用UTF-8编码

- - CSDN博客编程语言推荐文章
JSP,mysql,tomcat下(基于struts2)中文及其乱码问题的解决 6大配置点 使用UTF-8编码. 目前对遇到J2EE 开发中 中文及其乱码问题,参考网上资料做个总结, 主要是6大配置点:. 1 struts2配置 2 数据库 3 页面 4 jdbc连接 5 tomcat 6.hibernate配置.

utf-8编码已经成为主流

- hongleij - 阮一峰的网络日志
今天,我在网上看到一张图,据说是来自Google内部的统计——世界上所有网页编码统计图. 第一眼看到这张图,我感到很振奋,utf-8编码终于成为了主流. 可是再看第二眼,顿时就泄气了. 因为份额下降的是ASCII和ISO 8859-1这两类编码,而GB类的中文编码份额几乎保持不变. 那样的话,utf-8编码份额的上升,其实没有多大实际意义,因为ASCII和ISO 8859-1本身就是同utf-8兼容的,转不转化无所谓.

C++:UTF-8与GB2312之间的互换

- 张家良 - C++博客-首页原创精华区
本文章由李木空间 www.limou.net 发布,转载请注明链接. 话不多说,前几天我就遇到了字符之间的麻烦,在网页中出现了乱码,为此我还写了个百度经验,呵呵. 现在就是解决这个问题的时候了,当然用txt自带的“另存为”就可以简单的转换,但是现在讨论的是如何利用c++中的函数来改变的. 下面介绍一下WinAPI的两个函数:WideCharToMultiByte、MultiByteToWideChar.

UTF-8编码中BOM的检测与删除

- 競 - 火丁笔记
所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space. 注:Unicode相关知识的详细介绍请参考UTF-8, UTF-16, UTF-32 & BOM.

UTF-8 GBK UTF8 GB2312 之间的区别和关系

- 维维孙 - 博客园-首页原创精华区
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM. 是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码. UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强. UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示.

字符编码笔记:ASCII,Unicode和UTF-8

- - 移动开发 - ITeye博客
今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思路. 但是,我尽量试图写得通俗易懂,希望能对其他朋友有用. 毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识.

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).

Java PaaS 对决

- 呆瓜 - IBM developerWorks 中国 : 文档库
本文为 Java 开发人员比较了三种主要的 Platform as a Service (PaaS) 产品:Google App Engine for Java、Amazon Elastic Beanstalk 和 CloudBees RUN@Cloud. 它分析了每种服务独特的技术方法、优点以及缺点,而且还讨论了常见的解决方法.