/*
 * $Id: CharsetUtils.java,v 1.3 2006/02/21 12:59:36 akabane Exp $
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.common.charset;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

/**
 * キャラクタセット変換ユーティリティ
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class CharsetUtils {
	/**
	 * コンストラクタ．
	 * インスタンス化は禁止する．
	 */
	private CharsetUtils() {
	}
	/**
	 * 指定のエンコーディングに変換した文字列を返す．
	 * @param encoding 変換先のエンコーディング
	 * @param str 元の文字列
	 * @return 変換された文字列
	 * @throws UnsupportedEncodingException 未サポートのキャラクタセットが指定された
	 */
	public static final String encode(String encoding, String str) throws CharacterCodingException, UnsupportedEncodingException {
		Charset charset = Charset.forName(encoding);
		CharsetEncoder encoder = charset.newEncoder();
		CharBuffer cb = CharBuffer.allocate(str.length());
		cb.put(str);
		cb.rewind();
		ByteBuffer bb = encoder.encode(cb);
		int limit = bb.limit();
		return new String(bb.array(), 0, limit, "ISO-8859-1");
	}
	/**
	 * 指定のエンコーディングでエンコードされている文字列をデフォルトエンコーディングに変換する．
	 * @param encoding 変換元のエンコーディング
	 * @param str 変換された文字列
	 * @return 復元された文字列
	 * @throws UnsupportedEncodingException 未サポートのキャラクタセットが指定された
	 */
	public static final String decode(String encoding, String str) throws UnsupportedEncodingException {
		return new String(str.getBytes("ISO-8859-1"), encoding);
	}
	/**
	 * 索引語のエンコーディング変換が必要かどうかをテストする．
	 * テスト結果は，needToEncodeフィールドに格納される．
	 * @param encoding 変換する予定のエンコーディング
	 * @return true:変換する必要がある / false:変換する必要はない
	 */
	public static final boolean testNeedToEncode(String encoding) {
		// 指定されたエンコーディングがサポートされていない場合，変換されては困る
		if(Charset.isSupported(encoding) == false) {
			return false;
		}

		// ようするに，システムエンコーディングと同じであれば変換の必要がないはず
		Charset cs = Charset.forName(encoding);
		String systemEncoding = System.getProperty("file.encoding");
		for(String alias : cs.aliases()) {
			if(systemEncoding.equals(alias)) {
				return false;
			}
		}

		return true;
	}
}
