仕様検討>CodeMapping
最終更新日: 2007.11.03
文責: Rastiv
ここは UTF-16 LE を内部編集文字コードと仮定する場合の、他の文字コード(SJIS, JIS, EUCJP, UTF-8, UTF-7)間の適切な変換方法と変換失敗時の例外処理問題について扱う場所です。
テキストエディタとは、文字のみのファイル(テキストファイル)を作成・編集するためのアプリケーションソフト(IT用語辞典より)でありますので、字形が一致すればコードポイントが違っていても同一視するのが基本です。複数の文字コードが入り混じったファイルの編集、一つの字形に対応する複数の文字コード値の中から一つ指定する必要のあるファイルの編集、ワード文書ファイルの単語検索、EXE ファイルのメッセージ部分の編集といった用途で使用する人がいらっしゃるらしいですけれども、それらは少なくともテキストエディタの域を超えた使用法であるという認識を前提に、コード間の変換方法について気まぐれに検討します(汗)
問題点
1. 他コードから UTF-16 への変換に失敗した文字をそのまま読み込むため、ユーザーから見てそれと認識不能な状態で文字化けを起こす。
1. CP932 コード系(SJIS, JIS, EUCJP)から UTF-16 へ変換すると、暗黙のうちに重複コード解消フィルターにかけられるため、文字コード間の 1 対 1 対応が取れなくなる。
解決方法の概要:
1. 文字化けを起こした箇所をそのままにせず、ソレと認識できるように加工して読み込む。ただし、JIS と UTF-7 に限っては、フォーマットエラーが見つかれば置換文字を使い、呼び出し側にエラーを報告する措置をとる。
1. 既定コードポイントを定め、それ以外のコードポイントからの一方向変換を抑制するオプションを新設することで対応する(細かいことはユーザーに任せる)。ただし JIS の読み込みではメールセーフデータであることを前提に、できる限り変換する。
既定値コードポイントの提案:
SJIS の既定値が変更になりそうなコードポイント
0x81ca, // ¬ (0xeef9 から変更) 0x81e6, // ∵ (0x879a から変更)
(Last Update: 2007.04.30)
''勝手ながらこの項目は一時的に却下させて頂きます''
言い訳:1)bregonig.dll との整合性が取れない。2)実現する見込みが非常に薄い。
Unicode のコードポイント値の組み合わせクラス値 (Combinating Class) を確認し、クラス値 0 の Unicode 文字から始まりクラス値 1 以上の文字が 0 個以上続く文字列を1文字分と捕らえる。この規則に当てはまらない例外文字も数文字あるが無視できる範囲とする。
(Last Update: 2007.11.03)
SJIS(CP932)
重複コード解消フィルタにかけると値が変わった。(オプションにより選択)
MultiByteToWideChar での変換に失敗した。
EUCJP(CP51932)
第1バイトと第2バイトの8ビット目を0にしたものを _mbcjistojms の入力に与えて変換した結果、失敗した。
SJIS に変換した後重複コード解消フィルタにかけると値が変わった。(オプションにより選択)
UTF-8
UTF-8 フォーマット検査でエラーが出た。
UTF-16
UTF-16 のフォーマット検査でエラーが出た。
JIS(CP5022x)
_mbcjistojms での変換に失敗した。
不明な JIS エスケープシーケンスが発見された。
UTF-7
UTF-7 フォーマット検査でエラーが出た。
(Last Update: 2007.09.22)
既定コードポイントに従った SJIS コードを 便宜上 NecSJIS と呼ぶことにする。
値の埋め込み方法:
0x00 → -1 '0' '0' 0x01 → -1 '0' '1' 0x02 → -1 '0' '2' : : 0xFF → -1 'F' 'F'
変換ルート:
1. ( SJIS(CP932), EUCJP(CP51932) ) → NecSJIS → UTF-16 LE 2. ( UTF-8, UTF-16 BE ) → UTF-16 LE 3. ( JIS(CP5022x), UTF-7 ) → UTF-16 LE
ルート 1. と 2. では、各段階で変換できなかった文字が埋め込み値として結果データに蓄積される。ルート 3. の変換エラーでは、符号化シーケンスの崩れを防ぐため、以下の通りに処理する:
出力時は、この 3 つのルートの逆を辿り蓄積された埋め込み値を順次復元させるが、文字コード解釈がJISまたはUTF-7の場合は、この限りではない。
(Last Update: 2007.11.3)
この項目については未定です
入力される正規表現を外部ライブラリに渡すときは、埋め込み値を除いて検索するように正規表現を加工する。
(Last Update: 2007.09.22)