/*
 * Copyright (C) 2005-2006 Kouji Sugisawa. All rights reserved.
 */

package jp.sourceforge.livez.lang;

import java.io.UnsupportedEncodingException;

/**
 * このクラスは、JIS (ISO-2022-JP)、シフトJIS (Windows-31J)、EUC-JP の自動判別を行う機能を提供します。
 * 
 * @author 杉澤 浩二
 */
public final class JISAutoDetect {

	/**
	 * インスタンス化できない事を強制します。
	 */
	private JISAutoDetect() {}

	/**
	 * 指定された文字列から日本語文字コードを自動判別し Unicode へ変換(デコード)します。
	 * 
	 * @param str 文字列
	 * @return Unicode へ変換された文字列
	 */
	public static String decode(final String str) {
		try {
			return decode(str.getBytes("8859_1"));
		} catch (UnsupportedEncodingException e) {
			return str;
		}
	}

	/**
	 * 指定されたバイト列から日本語文字コードを自動判別し Unicode へ変換(デコード)します。
	 * 
	 * @param bytes バイト配列
	 * @return Unicode へ変換された文字列
	 * @throws UnsupportedEncodingException
	 */
	public static String decode(final byte[] bytes) throws UnsupportedEncodingException {
		// 指定されたバイト列中に ESC コードがあれば JIS と判断します。
		for (int i = 0; i < bytes.length; i++) {
			if (bytes[i] == (byte)'\u001B') {
				return WindowsJIS.decode(bytes);
			}
		}

        // EUC-JP でデコードして例外が発生する場合は、シフトJIS とみなします。
        try {
            return WindowsEUCJP.decode(bytes);
        } catch (UnsupportedEncodingException e) {
			// それ以外の場合は、シフトJISとみなします
			return new String(bytes, CharEncoding.SHIFT_JIS);
        }
	}

}
