最近のトラックバック

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

文字コード自動判別

Javaで文字コードを判別するにはいくつかの方法がありますが、CharsetDecoderを使用する方法を以下に示します。ただし、下記のコードには以下の問題点があります。

  1. 先頭の1024バイトしかみません
  2. JISコード(ISO-2022-JP)は判別できません
  3. 自動判別すべてにいえることですが、マルチバイト文字が少ないと誤認識する可能性があります

/*
 * This code is under public domain.
 */
public class EncodingDetector {

	private static final int SIZE = 1024;

	private static final String[] CODES = new String[] {
		"UTF-8", "Windows-31J", "EUC-JP", "UTF-16BE", "UTF-16LE"
	};

	public Charset detect(InputStream ins) throws IOException {
		byte[] a = new byte[SIZE];
		CharsetDecoder cd;
		CoderResult cr;
		ByteBuffer bb;
		CharBuffer cb;
		Charset ch;
		int l;

		cb  = CharBuffer.allocate(SIZE);
		l   = ins.read(a);
		for(String s : CODES) {
			ch = Charset.forName(s);
			cd = ch.newDecoder();
			cd.onMalformedInput(CodingErrorAction.REPORT);
			bb = ByteBuffer.wrap(a, 0, l);
			cr = cd.decode(bb, cb, false);
			if(!cr.isError()) {
				return ch;
			}
		}
		return Charset.defaultCharset();
	}

}

バイト列から文字へのエンコード

バイト列から文字へのエンコードはInputStreamReaderなどでできますが、直接エンコードしたいときもあります。そのときはCharsetDecoderを使用します。

例を以下に示します。

/*
 * This code is under public domain.
 */
public class DecodeTest {

	public static int getchar(InputStream ins,
			Charset encoding) throws IOException {
		CharsetDecoder cd = encoding.newDecoder();
		ByteBuffer bb = ByteBuffer.allocate(8);
		CharBuffer cb = CharBuffer.allocate(8);
		byte[] a = new byte[8];
		int b;

		for(int i = 0; i < a.length; i++) {
			if((b = ins.read()) < 0) {
				return -1;
			}
			a[i] = (byte)b;
			bb.put(a, 0, i + 1).flip();
			if(cd.decode(bb, cb, true).isUnderflow()) {
				cd.flush(cb);
				if(cb.flip().hasRemaining()) {
					return cb.get();
				}
			} else {
				bb.clear();
			}
		}
		return -1;
	}

}

Schluessel Ver. 0.4.3をリリースしました

Schluessel Version 0.4.3をリリースしました。

以下のサイトでダウンロードできます。
http://morilib.net

東京ビッグサイトにて開催されますコミックマーケット83にも出展します。
場所は2012/12/31(月) 東Y-22aです。
皆様のご来場をお待ち申し上げます。

Twitter始めました

Twitter始めました。

Schluessel-Scheme@SchluesselLangという名前で登録しています。
よろしくお願いします。

オープンソースカンファレンス2012 Kyotoの資料をアップロードしました

オープンソースカンファレンス2012 Kyotoの資料をアップロードしました。
次のサイトからダウンロードできます。
http://schluessel.sourceforge.jp/index.html.ja

Schluesselのドキュメントを英訳しました

Schluesselのドキュメントを英訳しました。

ドキュメントのURLは以下の通りです。
http://schluessel.sourceforge.jp/schluessel.en/schluessel.en.html

オープンソースカンファレンス2012 Kyotoに参加しました

8/4(土)に京都リサーチパークにて開催されました
オープンソースカンファレンス2012 Kyotoに参加しました。

お忙しい中morilib.netブースにご来場いただきまして
誠にありがとうございます。
多くの方々と有意義が話ができました。
発表資料は後ほど配布する予定です。

また、ニコニコ動画に発表内容の動画をアップロードしました。
http://www.nicovideo.jp/watch/sm18533076

次回は9/8(土)に東京・明星大学で開催されます
オープンソースカンファレンス2012 Tokyo/Fallに参加予定です。

また皆様のお越しをお待ち申し上げます。

オープンソースカンファレンス2012 Kyotoに参加します

8/3(金)〜8/4(土)に京都リサーチパーク(KRP)にて開催されます
オープンソースカンファレンス2012 Kyotoに参加します。

最新バージョンの展示をする予定です。
なお、morilib.netの展示は8/4(土)のみとなります。

オープンソースカンファレンスの詳細については、
http://www.ospn.jp/osc2012-kyoto/
を参照願います。

皆様のご来場をお待ち申し上げます。

Schluessel Ver. 0.4.2をリリースしました

Schluessel Ver. 0.4.2をリリースしました。
以下の機能を追加しました。

  • Swingのリスト・進捗バー・ツリー・タイマをサポートしました。
  • Bairstow法による1変数多項式方程式の解法をサポートしました。
  • カーソルの形状変更をサポートしました。
  • コマンドラインオプションを整理しました。

以下のサイトでダウンロードできます。
http://schluessel.sourceforge.jp/download.html

Swingのリスト・ツリー・プログレスバー・Swingタイマをサポートしました

Swingのリスト・ツリー・プログレスバー・Swingタイマをサポートしました。

例: リストの生成
(define lst (make-jlist '(haruka kaiji azusa)))

例: ツリーの生成
(define tr
  (make-jtree
    '(limited-express
       (chuo-line kaiji azusa)
       (tokaido-line odoriko super-view-odoriko)
       (hanwa-line haruka))))

例: プログレスバーの生成
(define bar (make-progress-bar 'horizontal 100 0))

例: Swingタイマ
(define tim
  (make-swing-timer
    1000  ; 起動間隔(ミリ秒)
    (lambda (e)
      (progress-monitor-progress-set! mon cnt)
      (set! cnt (+ cnt 10)))))

«コマンドラインオプション・起動プロパティを整理しました