holmesのメモ帳

始めなければ始まらない。頭の中で考えているだけなのは終わりにして手を動かして色々と作っていこう。

.NETでテキストファイルの文字コードの判定

特定の業務のデータの場合は文字コードがある程度一定になるけれど
汎用的なツールを作ろうとするとどんな文字コードのファイルが来るか解らないので
文字コードの判定が必要になってくる。

しかし.NET Frameworkでは文字コードを判別する方法が用意されていない..

最初に参考にさせて頂いたのはDOBON.NETさんの「文字コードを判別する」というページ
http://dobon.net/vb/dotnet/string/detectcode.html

Jcode.pmを参考にした方法という事でロジックを追いかけてみると
全ての文字をバイナリ配列に変換しEUCSJIS、UTF8の可能性の高いところにカウントして
最終的にカウントの一番大きかったのをこれじゃない?って感じで返してくる

で、最初はこのライブラリをそのまま使っていて問題なかったのだけど
ある日別の仕事で扱ったデータを試しに流してみたら問題が起きた。
SJISであるはずのテキストファイルがEUCに判定されてしまったのだ。
同形式のファイルが複数あったが全てEUCと判定される。

1つ気になるのはこのファイルには半角カナが多いという点。
これが判定を狂わせている可能性はあるかと思った。
(細かくは調べてない)

時間も無いしどうしようかと思っていたらこれの改良版を書いている人がいた。

HNXgrepのC#による文字コード判定Add Star
http://d.hatena.ne.jp/hnx8/20120225/1330157903

基本的には、DOBON.NET様のサイトで公開されているJcode.pmのC#移植版 http://dobon.net/vb/dotnet/string/detectcode.html の考え方をベースに、

UTF16(BOMなし半角英数のみ)ファイルの検出機能を追加
EUC/SJISの判別を強化するため、半角カナ文字の連続/全角文字の連続についてはポイント評価を高めに補正(※)
といった独自対応を行っています。

やはりポイント評価の数値を変えて微調整するしかないのか。


で、このロジックに置き換えて試してみたら問題のファイルは正しく判定された。


あくまでも可能性を追求するロジックではあるので誤判定される可能性は残されているが
とりあえずはこれで様子を見てみよう。


文字コードの判定ロジックなんて今まで気にした事なかったけど
時間のある時にまた追いかけてみようと思う。