[mayaa-user:706] Re: WebSphere6.1でsun.io.MalformedInputException

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 11月 19日 (水) 01:00:08 JST


小林 (koichik) です.

Date:    Tue, 18 Nov 2008 10:13:12 +0900
From:    [E-MAIL ADDRESS DELETED]
To:      [E-MAIL ADDRESS DELETED]
Subject: [mayaa-user:705] Re: WebSphere6.1でsun.io.MalformedInputException

> 調査したマシンは、Windows2000です。

[mayaa-user:701] の情報は関係なかったようですね.

ともあれ (JW),状況が理解できました.
IBM JDK + Neko HTML + Mayaa の組み合わせで
起きる現象です.

・IBM JDK の挙動

UTF-8 のバイト列から String の内部表現である
UTF-16 に変換する際,不正なバイトがあると
IBM JDK は MalformedInputException をスロー
します.
# Sun の JDK はスローしません.

例えば Shift_JIS で保存された日本語を含む
ファイルを FileReader で UTF-8 として
読み込むと,IBM JDK では例外となります.

・Neko HTML の挙動

Neko は最初にデフォルトエンコーディングで
InputStreamReader をインスタンス化し,
バッファイサイズ (2048 文字) 分読み込みます.
そして <meta> によるエンコーディングの指定が
見つかると,そのエンコーディングで 
InputStreamReader をインスタンス化し直します.
Neko 自身が持っているデフォルトエンコーディングは
Windows-1252 (ISO 8859-1 の上位集合) です.

・Mayaa の挙動

Mayaa は Neko の HTML パーサを構築する際,
デフォルトエンコーディングに UTF-8 を
設定します.

TemplateParser.TemplateParserConfiguration の
コンストラクタ
----------------------------------------------------------------------
/* テンプレート上にエンコーディング指定がなければUTF-8と見なす */
setProperty(TemplateScanner.HTML_DEFAULT_ENCODING, TEMPLATE_DEFAULT_CHARSET);
----------------------------------------------------------------------

・IBM JDK + Neko HTML + Mayaa を組み合わせた場合

Neko HTML は Mayaa から設定された UTF-8 で
InputStreamReader をインスタンス化し,バッファ
サイズ (2048 文字) 分読み込みます.
その中に UTF-8 として不正なバイトがあると,
IBM JDK は MalformedInputException をスロー
します.

Shift_JIS で保存された HTML の最初の 2048 文字に
日本語が含まれると例外となります.
Unicode エスケープしていれば回避できます.
<link> や <script>,空白 (笑) 等で最初の
2048 文字に日本語が出てこないようにしても
回避できます (<title> は <head> の後の方に書く).

・抜本的対策

現在 Mayaa が Neko HTML に設定するデフォルト
エンコーディングは UTF-8 固定ですが,これを
設定で変更できるようにするのがよいかと.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



mayaa-user メーリングリストの案内