文字コード判定

JIS/EUC変換読み書き部分を作り直し、今まで対応してなかった文字に対応したので、
文字コード自動判定部分も、新たに対応した領域を使いたい。
jconvert.pasは結構古いものなので、
JIS、EUCを検出することは出来ても、UTF-8やUTF-7を自動判定することは出来ず、
真魚では、まずjconvert.pasの判定もして、
しかも自前で書いたUTF-7とUTF-8の判定をもするという形をとっているわけだが、
全部まとめて1passで判定する関数を作りたいと思っているわけだ。

そこで一つ問題が見つかった。
それはEUCでもJISでもなく、UTF-8だ。
現在、UTF-8はシステムに変換をさせているのだが、書き込みはたぶん問題ない。
そもそもユニコードからユニコードへの変換だから、
UTF-16からUTF-8に変換して保存するのに問題がでるはずもないだろう。
だが、逆にUTF-8ファイルから読み込む場合にちょっとマズい実装がある。
UTF-8やUTF-7はEUCやSJISによく似たファイル形式で、
半角部分は1バイト、それ以外の文字は複数バイトで書かれるわけだが、
その複数バイトの組み合わせが定義から外れていた場合、
UTF-8からの変換の場合だけ一切の文字を返さないのだ。
たとえばテキストファイルの先頭から最後の2文字目まで正当なUTF-8で、
最後の1文字がUTF-8では使えない0x80なんかが入っていたとする。
その、最後の1文字を除く、そこまでのテキストはせめて変換して欲しいのだが、
バイナリエディタで不正な文字を入れて試したら全くのゼロだった。
これって、OSのバグかなぁと思って調べてみたら、
DelphiのUTF-8変換はOSを介していない事がわかり、悪いのはDelphiだとわかった。
試しにMultiByteToWideCharで、OSに変換させてみたところ、
最後の不正な文字の前までちゃんと変換された。

そういうことで、これまではUTF-8かどうかを判定するために、
全テキストの最初から最後までがキッチリUTF-8に沿っているか調べていたが、
これからは、先頭からチェックしてEUCやSJISの可能性が消えた時点で、
UTF-8として判定をやめ、変換処理に移ると言う形でいけるのではなかろうか。

無論、自動判定を日本語以外のテキストにまで使う気はない。

4534032242
4534032242

たぶん関連のある記事:

コメントは終了しています。