MORIYAMA Masayuki
moriy****@mirac*****
2006年 3月 23日 (木) 14:53:22 JST
ミラクル・リナックスの森山です。 いろいろと反響があり説明が必要と思われますので、ISO-2022-JP-MS について 説明したいと思います。 まず比較のため、次の5つの文字コードの簡単な定義を示します。 ・x-iso2022jp-cp932 ・CP50220 ・CP50221 ・CP50222 ・ISO-2022-JP-MS これら 5 つは、Unicode 経由で cp932 と相互変換可能のなのものです。 ■ x-iso2022jp-cp932 o TR X 0015:2002 XML日本語プロファイルで定義されている o Windows 機種依存文字は表現できない TR X 0015:2002 XML日本語プロファイル 購入 http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=TR+X+0015%3A2002&dantaiCd=JIS&status=1&pageNo=0 HTML http://www.y-adagio.com/public/standards/tr_xml_jpf2/toc.html 使用するエスケープシーケンス 文字セット esc seq. 1バイト目 2バイト目 --------------------- --------- ------------------- --------- ------ US-ASCII ESC ( B 0x00-0x7F -- in/out JIS X 0201 ラテン文字 ESC ( J 0x00-0x7F -- in JIS X 0208:1978 ESC @ B 0x21-0x28,0x30-0x74 0x21-0x7E in JIS X 0208:1997 ESC $ B 0x21-0x28,0x30-0x74 0x21-0x7E in/out ※in = x-iso2022jp-cp932 から Unicode への変換 out= Unicode から x-iso2022jp-cp932 への変換 ■ CP50220 o Windows Codepage 50220 o Outlook Express, Internet Explorer での ISO-2022-JP o JIS X 0201 片仮名を JIS X 0208 の片仮名に置換 使用するエスケープシーケンス 文字セット esc seq. 1バイト目 2バイト目 --------------------- --------- ------------------- --------- ------ US-ASCII ESC ( B 0x00-0x7F -- in/out JIS X 0201 ラテン文字 ESC ( J 0x00-0x7F -- in JIS X 0201 片仮名 ESC ( I 0x21-0x5F -- in SO/SI 0x21-0x5F -- in ESC ( B 0xA1-0xDF -- in ESC ( J 0xA1-0xDF -- in JIS X 0208:1978 ESC @ B 0x21-0x28,0x30-0x74 0x21-0x7E in JIS X 0208:1997 ESC $ B 0x21-0x28,0x30-0x74 0x21-0x7E in/out NEC特殊文字 ESC $ B 0x2D 0x21-0x7E in/out NEC選定IBM拡張文字 ESC $ B 0x79-0x7C 0x21-0x7E in/out ユーザ定義文字 ESC $ B 0x7F-0x92 0x21-0x7E in/out ※in = CP50220 から Unicode への変換 out= Unicode から CP50220 への変換 ■ CP50221 o Windows Codepage 50221 o JIS X 0201 片仮名を ESC ( I でエンコード 使用するエスケープシーケンス 文字セット esc seq. 1バイト目 2バイト目 --------------------- --------- ------------------- --------- ------ US-ASCII ESC ( B 0x00-0x7F -- in/out JIS X 0201 ラテン文字 ESC ( J 0x00-0x7F -- in JIS X 0201 片仮名 ESC ( I 0x21-0x5F -- in/out SO/SI 0x21-0x5F -- in ESC ( B 0xA1-0xDF -- in ESC ( J 0xA1-0xDF -- in JIS X 0208:1978 ESC @ B 0x21-0x28,0x30-0x74 0x21-0x7E in JIS X 0208:1997 ESC $ B 0x21-0x28,0x30-0x74 0x21-0x7E in/out NEC特殊文字 ESC $ B 0x2D 0x21-0x7E in/out NEC選定IBM拡張文字 ESC $ B 0x79-0x7C 0x21-0x7E in/out ユーザ定義文字 ESC $ B 0x7F-0x92 0x21-0x7E in/out ※in = CP50221 から Unicode への変換 out= Unicode から CP50221 への変換 ■ CP50222 o Windows Codepage 50222 o JIS X 0201 片仮名を SO/SI でエンコード 使用するエスケープシーケンス 文字セット esc seq. 1バイト目 2バイト目 --------------------- --------- ------------------- --------- ------ US-ASCII ESC ( B 0x00-0x7F -- in/out JIS X 0201 ラテン文字 ESC ( J 0x00-0x7F -- in JIS X 0201 片仮名 ESC ( I 0x21-0x5F -- in SO/SI 0x21-0x5F -- in/out ESC ( B 0xA1-0xDF -- in ESC ( J 0xA1-0xDF -- in JIS X 0208:1978 ESC @ B 0x21-0x28,0x30-0x74 0x21-0x7E in JIS X 0208:1997 ESC $ B 0x21-0x28,0x30-0x74 0x21-0x7E in/out NEC特殊文字 ESC $ B 0x2D 0x21-0x7E in/out NEC選定IBM拡張文字 ESC $ B 0x79-0x7C 0x21-0x7E in/out ユーザ定義文字 ESC $ B 0x7F-0x92 0x21-0x7E in/out ※in = CP50222 から Unicode への変換 out= Unicode から CP50222 への変換 ■ ISO-2022-JP-MS o JIS X 0201 片仮名を ESC ( I でエンコード o ユーザ定義文字を ESC $ ( ? でエンコード 使用するエスケープシーケンス 文字セット esc seq. 1バイト目 2バイト目 --------------------- --------- ------------------- --------- ------ US-ASCII ESC ( B 0x00-0x7F -- in/out JIS X 0201 ラテン文字 ESC ( J 0x00-0x7F -- in JIS X 0201 片仮名 ESC ( I 0x21-0x5F -- in/out JIS X 0208:1978 ESC @ B 0x21-0x28,0x30-0x74 0x21-0x7E in JIS X 0208:1997 ESC $ B 0x21-0x28,0x30-0x74 0x21-0x7E in/out NEC特殊文字 ESC $ B 0x2D 0x21-0x7E in/out NEC選定IBM拡張文字 ESC $ B 0x79-0x7C 0x21-0x7E in/out ユーザ定義文字 ESC $ ( ? 0x21-0x34 0x21-0x7E in/out ※in = ISO-2022-JP-MS から Unicode への変換 out= Unicode から ISO-2022-JP-MS への変換 ユーザ定義文字のエスケープシーケンスは JIS X 0202:1998 (ISO/IEC 2022:1994) 情報技術―文字符号の構造及び拡張法 の次の規定を利用 ------------------------------------------------------------------ 13.3.3 私用 どのエスケープシーケンスにおいても, 終端バイトの Fp ( すなわち, 03 の列) は, 私用のため保留とする。私用のためのエスケー プシーケンスは, ISO 2375 の登録対象外とする。これらは, 交換当事者 間の合意によって定義する。 ------------------------------------------------------------------ ■ 検討 ○ x-iso2022jp-cp932 TR X 0015:2002 XML日本語プロファイル > 5.5 ISO-2022-JP > 参考2 を引用 します。 ---------------------------------------------------------------------- 参考2 いったんシフトJIS又は日本語EUCを経由するからといっても,[IETF RFC 1468]が許していない文字が使用できるわけではない。たとえば, x-sjis-cp932は, NEC特殊文字, NEC選定IBM拡張文字, IBM拡張文字, ユーザ外 字を表現できるが,x-iso2022jp-cp932がそれらの文字を表現できるわけでは ない。 ---------------------------------------------------------------------- この事から、x-iso2022jp-cp932 で Windows 機種依存文字を表現する事は好 ましくないと思われます。 Windows 利用者からのメールに含まれる Windows 機種依存文字を変換して処 理したいという目的には使えない事になります。 ○ CP50220〜CP50221 上記の定義は、明文化されているものではなく、独自に調べた結果をまとめて ものです。 JIS X 0201 片仮名の変換の違いにより 3 種類のコードページが用意されて いるという事と、ユーザ定義文字の表現方法が JIS X 0202(ISO/IEC 2022) から逸脱しているという点が特徴的です。 x-iso2022jp-cp932 として出力する場合は、アプリケーションソフトウェアで JIS X 0201 片仮名、Windows 機種依存文字、ユーザ定義文字のフィルタリン グをする必要があると思われます。 ○ ISO-2022-JP-MS 用途によって、フィルタリングすべき文字セットが変化する事が予想されるた め、文字コード変換のレベルでは、フィルタリングを施さずに変換できるよう にしておいた方が良いのではないかと考えて ISO-2022-JP-MS を定義しまし た。 ユーザ定義文字に関しては、Outlook Express (CP50220) のように、ISO 2022 から逸脱した方法でエンコードしてしまうのは好ましくないため、 ISO-2022-JP-MS では ISO 2022 (JIS X 0202) に沿う形でエスケープシーケ ンスを定義しています。 ■ ご意見をください。 ISO-2022-JP-MS のようなものを作ってしまうと、アプリケーションソフト 側で適切にフィルタリングせずに、ISO-2022-JP として出力してしまう事に つながるから問題だという考え方もあるかもしれません。 この問題に対する解決策の 1つの案として、重複定義文字を除く CP932 の 全文字を扱える ISO-2022-JP-MS と、x-iso2022jp-cp932 のように RFC1468 の ISO-2022-JP としてそのまま使えるものと 2 種類用意する事かなと考え ているところです。 メール受信時は、ISO-2022-JP-MS でデコードし、メール送信時は x-iso2022jp-cp932 でエンコードして、変換できない文字が含まれる場合は、 警告メッセージを出して UTF-8 などで送信するといった処理が、迷惑にな らない MUA の実装方法ではないかと考えています。 みなさんの意見をお聞かせいただければと思っております。 -- 森山 将之 moriy****@mirac***** ミラクル・リナックス株式会社