misc.log

日常茶飯事とお仕事と

UTF-8かどうかの判定(C#)

別システムからのデータファイル取り込み処理で、文字コードが不明であった場合にどうするか、という話から、UTF-8かどうかのチェックができるのか?という話題になりました。

UTF-8の種類

UTF-8という文字コードには、BOM(Byte Order Mark)という情報があるバージョンと、無いバージョンがあります。BOMがある場合、UTF-8データの先頭を見てBOMに該当するデータパターンが入っていれば「BOM有りのUTF-8」ということで簡単に判断可能です。しかし、世の中の大半のUTF-8データはBOM無しなので、実はこの方法はたいていの場合使えません。

BOM無しUTF-8の判定

具体的な手法やロジックは追えてないのですが、stackoverflowの下記のスレッドから、CodePlexにライブラリが掲載されていることが判りました。

stackoverflow.com

こちらです。

archive.codeplex.com

CodePlexはすでにクローズされることが決まっているので、いずれはGitHubに移行されるのかもしれませんが、2019年2月時点では上記リンクからダウンロード可能です。

Utf8Checker

ファイルをダウンロードするといくつかフォルダが出てくるのですが、「sourceCode」というフォルダにソースが入っています。ファイルは古いVisual Studioなので、Visual Studio 2017などで開くとコンバーターが動きますが、そのまま変換して問題なさそうです。
ソースにはテストプロジェクト(Unicode.Tests)と、本体であるUnicodeプロジェクトがあります。実際に自分で使う場合はUnicodeプロジェクトのビルド結果(DLLファイル)を参照して、UTFCheckerクラスのインスタンスを生成して使うようです。
メソッドは大きく2つ。

  • Checkメソッド …… ファイル名を指定してファイルがUTF-8かどうかを判定する。
  • IsUtf8メソッド …… strem形式のデータを指定してUTF-8かどうかを判定する。

前者のCheckは、ファイルを開いてIsUtf8に判定を依頼するもので、実質的に動くロジックは同じです。

面白いのはテストに使っているデータ。https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt にあるものがテストプロジェクトに入っています。我々がテストをするとどうしても複雑な日本語に限定したテストをしがちですが、前述リンク先にあるファイルはいろんな言語や記号も含まれているので、他の文字コード関連テストにも使えるかもしれません。

とりあえず自分用メモということで。


[改訂新版]プログラマのための文字コード技術入門 (WEB+DB PRESS plusシリーズ)