/** * @file JCharDetector.java * * @revision: none * * @version 0.0.01 * @author: Zenki (zhajun), zenki2001cn@163.com * @date: 2011-6-22 下午03:19:22 */ package com.easyview.ebook.reader.engine.util.charsetcodec; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CoderResult; import java.util.ArrayList; import com.easyview.ebook.reader.engine.util.Logger; public class JCharDetector implements ICharsetDetect { static private final String TAG = "JCharDetector"; private ArrayList<Charset> mCharsetList; private final String[] CHARSET_LIST = { "GBK", "BIG5", "EUC-KR", "EUC-JP", "UTF-8", "US-ASCII" }; public JCharDetector() { initCharsetList(); } @Override public String detectCodepage(InputStream is, int length) { String decode = null; for (Charset charset : mCharsetList) { if (canDecode(is, charset)) { decode = charset.name(); break; } else { Logger.eLog(TAG, "detectCodepage failed = " + charset.name()); } } return decode; } private boolean canDecode(InputStream is, Charset charset) { ReadableByteChannel channel = Channels.newChannel(is); CharsetDecoder decoder = charset.newDecoder(); ByteBuffer byteBuffer = ByteBuffer.allocate(2048); CharBuffer charBuffer = CharBuffer.allocate(1024); boolean endOfInput = false; int n = -1; try { n = channel.read(byteBuffer); } catch (IOException e) { e.printStackTrace(); return false; } byteBuffer.flip(); endOfInput = (n == -1); CoderResult coderResult = CoderResult.OVERFLOW; try { coderResult = decoder.decode(byteBuffer, charBuffer, endOfInput); } catch (Exception e) { e.printStackTrace(); return false; } charBuffer.clear(); if (coderResult.isOverflow()) { while (coderResult.isOverflow()) { try { coderResult = decoder.decode(byteBuffer, charBuffer, endOfInput); } catch (Exception e) { e.printStackTrace(); return false; } charBuffer.clear(); } } if (coderResult.isError() || coderResult.isUnmappable() || coderResult.isMalformed()) { Logger.eLog(TAG, "canDecode " + charset.name() + " isError"); return false; } byteBuffer.compact(); try { channel.close(); } catch (IOException e) { e.printStackTrace(); } return true; } private void initCharsetList() { mCharsetList = new ArrayList<Charset>(); for (String charset : CHARSET_LIST) { mCharsetList.add(Charset.forName(charset)); } // list all charsets // Map map = Charset.availableCharsets(); // Iterator it = map.keySet().iterator(); // while (it.hasNext()) { // String charsetName = (String) it.next(); // Logger.dLog(TAG, "charset name = " + charsetName); // } } }