[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 メーリングリストの案内