スポンサードリンク


Javaで簡単に文字コードを自動判別するライブラリ!文字化けさせずにファイルインポートでバイト情報に変換する方法!

    様々なプログラムを組んでいて外部ファイルのインポートやエクスポートを機能を実装したい時、
    ファイルの形式、文字コードなどを考慮した設計にする必要がありますよね。

    ファイルの形式はMimeTypeなどを指定してあげれば、
    簡単に判定をかけれますが、問題はファイルの文字コードの方です。

    プログラミングをしている人なら一度は経験したことがあるのではないでしょうか?

    プログラムに読み込ませた外部ファイルが文字化けして、
    エラーになってしまったり、うまく動作しなくなってしまったなんてことがありますよね。

    特にプログラムの利用者はインポートするファイルの文字コードを意識しないので、
    プログラム側で対応していない文字コード情報が直接的な不具合の原因に繋がるかもしれません。

     

    文字コードを意識したコーディングが重要

    よくある手法のひとつとして、ファイルのインポート時に、
    ユーザーにインポートするファイルの文字コードを選択してもらうというものがあります。

    ファイルはプログラム内ではストリーム形式で処理され、
    実データはバイト単位の情報を元に、文字コードを識別して文字列として変換します。

    この処理の際に必要なのが文字コードの書式であり、
    ストリーム形式で取得した情報を文字コードに対応させ、バイト情報として扱いますね。

    ですが、プログラマとしてはユーザーに文字コードを意識させることなく、
    システムを運用していくような想定で設計・開発していくのが望ましいです。

    ならばどうするかと言いますと、入力されたストリーム形式の情報の
    文字コードを自動判別してあげて、バイト情報に変換する前に、文字コードを確定してあげる必要があります。

    今回はJavaを例に文字コードの自動判別機能を実装するためのサンプルプログラムをご紹介したいと思います。

     

    Javaでインポートされたファイルの文字コードを自動判別する方法

    まずは文字コードを自動判別させるクラスをひとつ定義します。 
    String型で受け取ったファイルパスをそのままストリームでバイト変換する前に利用します。

    FileCharDetecter.class


    文字コードを判定させたい処理をコーディングしたクラスに、

    上記のFileCharDetecter.classをインポート指定してあげます。

    使い方は文字コードを判定させたいファイルのパスをこのクラスに通してあげて、
    返ってきた文字コードをストリームのバイト変換時に使用するというものです。

     

    スポンサードリンク

     

    以下は文字コードを判定し、そのままバイト変換するサンプルコードを記載しています。


    FileInputStreamクラスを利用する際に、ファイルパスと文字コードを指定して、文字列情報を取得させますよね?

    例えば、この際に文字コードを固定で“UTF-8”などと指定してしまうと、
    UTF-8ではない文字コードのファイルだった場合、確実に文字化けします。

    それを回避するために、今回実装したFileCharDetectorクラスが活躍するわけです。

    自動でファイル形式を判別し、そのままFileInputStreamクラスで文字コード指定を自動化できるので、文字化けさせずに文字列情報をJavaプログラム内で処理させることができます。

     

    UTF-8のBOMあり形式の文字コードには非対応

    様々な文字コードに対応させることはできるのですが、
    UTF-8形式でBOM有の設定をしたファイルを利用すると文字化けしてしまう、
    もしくは、例外が発生してしまう場合があるかもしれません。

     

    BOM有りのUTF-8とは?

    BOMとは簡単に言ってしまえば、ヘッダー情報のことですね。

    バイト順マーク(Byte Order Mark)とも呼ばれ、文書ファイルの先頭に付けるバイナリデータのことです。

    BOM指定したUTF-8はファイル内の文字列情報の先頭に3バイトのバイナリ情報(EF BB BF)が付加されます。

    テキストエディタなどで、UTF-8形式のファイルを保存する時に、
    設定項目にUTF-8のBOM有という項目はみたことありますでしょうか?

    UTF-8 BOMとは

    特に意識しなくても、基本はBOM無になっているのですが、何かのタイミングでBOM有にしてしまったり、
    他のアプリケーションツールがBOM有のUTF-8形式でファイルを保存する仕組みの場合、非常に厄介です。

     

    BOM指定のUTF-8で文字化けする原因

    私もPHP言語のプログラムで外部ファイルを扱うソフトウェアを開発したことがあるのですが、
    UTF-8形式で原因不明のエラーに直面し困ったことがありました。

    原因はUTF-8にBOMが付加されていたことでした。
    そもそも日本語はプログラム側では1文字につき4バイトの構成で出来上がっています。

    そこに3バイト分のBOMが先頭に付加されることで、1バイト分ずれてしまいます。

    それが要因でたいていのプログラムでBOM形式のテキスト文書で文字化けしてしまいます。

    正直なところBOMなんてものは全く持って必要ないです。
    プログラムでファイルインポート処理を実装するたびにBOMに悩まされます。

     

    ファイルの文字コード自動判定ソースの注意点

    長々とBOMについての文章を書いてしまいましたが、
    何が言いたいかと言いますと、今回ご紹介しました文字コード自動判別ソースは
    UTF-8のBOM指定を識別できないので、もしかしたら不具合が発生するかもしれません。

    テキスト文書のBOM指定そのものを識別する方法がロジック的になさそうなので、
    もしBOMを除去するなら、先頭の3バイト分を手動で判別する必要があります。

    もしロジック的にBOMを除去する方法があるなら是非知りたいところです。

      The following two tabs change content below.
      よっき プロフィール画像
      パソコンが大好きな青年。職業はプログラマ/SE。 フリーランスとしてウェブサイトの構築・保守の業務に従事。専門学校とパソコンスクールで講師も担当。幼少期からパソコンが大好きで、趣味がそのまま仕事に転じた。自作PCの魅力に惹かれたのは学生時代の頃。自作PC専門ブログで、お得な情報を紹介しています。

      スポンサードリンク


      コメントを残す




      CAPTCHA


      このページの先頭へ