mwSoft概要Unicodeには「ここからここは平仮名の領域」、「ここからここは漢字の領域」のように文字種に応じてブロックが決められている。それらを利用すれば解析対象の文字列が「何語で書かれているか」をある程度判定できたり、エンコードがどれが一番確からしいか確認できたりする、かもしれない。サンプルコードはJava1.6を使用。2010/02/26JavaのUnicodeBlockによる平仮名・カタカナ・漢字の判定例JavaのUnicodeBlockを使用すると、対象の文字列が平仮名であるかなどが判定できます。実行する前にjava.text.Normalizer.normalize使ってNFKCで正規化しておくと紛れが減るかもしれません。falseJavaの正規表現を使った平仮名・カタカナ・漢字の判定Perlにも似た表現があったり、Rubyは1.9から可能だったりするので、多くの言語で使えるはず。true指定文書でどのUnicodeブロックが使用されているか確認するそれぞれのブロックの意味についてはunicode.orgを見てもらうか、Wikipediaのこのページあたりを見てもらうかするとして、ここでは日本語で関わりがありそうなブロックのみを探してみることにします。文書を解析して、どのブロックが何度出現したかを調べる簡易コード。"[Java]でUnicodeのブロックを、云々するソース。5結果を見ての通り、「平仮名」は「HIRAGANA」、「カタカナ」は「KATAKANA」に分類され、「英字や記号」は「BASIC_LATIN」に分類されます。漢字は「CJK_UNIFIED_IDEOGRAPHS」、句読点や「々」はCJK_SYMBOLS_AND_PUNCTUATIONに分類されているようです。日本のサイトで実際に使用されているブロックを調べてみるWEB上のjpドメインのページを2571個ほど適当に読み込んで(複数のポータルサイトからスタートして、本当に適当にリンクを辿ってもらいました)、各文書に登場するUnicodeBlockの数をカウントしてみました。集計した文字数は全部で1億2千万くらい。タグを外して(というかDOMのTEXTの部分だけ読んで)、半角スペースを排除していますが、ScriptとかStyleタグの中身はカウントされいます。英字・記号の発生率は普通の文書より高めになっていると思います。多い母数とは言えないのと、エンコード失敗してる場合もあると思うので(レスポンスヘッダ見て指定してなければmeta見て判定はしてます)、まぁ、参考までの数値として。100.00000%見ての通り、BASIC_LATIN(基本ラテン文字)、CJK_UNIFIED_IDEOGRAPHS(漢字)、HIRAGANA(平仮名)、KATAKANA(カタカナ)の4種類だけで全体の97.78%をカバー出来ています。次に数の多いCJK_SYMBOLS_AND_PUNCTUATION(句読点とか)を加えると、99.68%。日本語の文はこの5種類で構成されていると思って良さそうです。ちなみにこの結果は直前でNFKCで正規化しています。正規化しない場合は、HALFWIDTH_AND_FULLWIDTH_FORMS(全角記号とか半角カナなど)が1%程度発生していました。