ファイルエンコードの自動判別に伴う問題について

ColdFusion 11より、ファイルエンコーディングに対する処理が変更され、エンコードの自動判別が行われるようになりました。判別方法については、昨年11月にアメリカで開催された ColdFusion Summit で紹介された下記のスライドを参照下さい。

http://www.slideshare.net/ColdFusionConference/coldfusion-internals/15
(slideshare: ColdFusion Internals 15ページ目)


これまでのColdFusion MX6.1 ~ 10 では、エンコードの自動判別は行われず、各ファイル内で<cfprocessingdirective pageencoding="エンコード"> タグでエンコードを指定していない場合、  「BOM付き UTF-8」か、「Java ファイルエンコード」のどちらかでないとファイルのエンコードが正しく認識されず文字化けが発生する要因となっていました。

ColdFusion 11ではエンコードの自動判別により、ファイルに<cfprocessingdirective>タグによるエンコードを指定していなくても、比較的自由なエンコードでファイルが作れるようになっていますが、反面、新たな問題が生じています。それは、主にWindows環境で使用されている Shift_JIS でファイルを作成した場合です。

ColdFusionの内部エンジンであるJavaにも Shift_JISのエンコードが備わっていますが、Shift_JISを指定すると、日本語の特殊文字などで文字化けを起こします。これは Windows環境で使用されている Shift_JISには、Shift_JISを拡張した「Windows-31J」と呼ばれるWindows標準文字セットであるのに対し、Javaでは Shift_JIS と Windows-31J(MS932) とが明示的に区別され、Shift_JISには日本語の特殊文字が含まれていないためです。

(※このあたりの情報は、下記のサイトが参考になると思います)
http://www.atmarkit.co.jp/ait/articles/0501/14/news118.html


従って、日本語の特殊文字も含みたい場合 Java では「Windows-31J(MS932) 」を指定する必要があります。しかし、ColdFusion 11のエンコードの自動判別では、このShift_JISとWindows-31J(MS932)とを区別することができず、「Shift_JIS」として判別してしまいます。従って<cfprocessingdirective>タグによるエンコードを指定していない Shift_JIS で作られたファイルを ColdFusion 11で処理すると、日本語特殊文字が文字化けを起こします。

 

対策としては下記のいずれかをご検討下さい
 

  • (ColdFusion 11 Update 3 以降)VM引数に「-Dfile.usesystemencoding=true」を追加する
    • 弊社(株式会社サムライズ)サポートチームからの情報として、ColdFusion 11 Update 3 以降、VMの引数に上記を追加すると以前のバージョンと同様にOSのデフォルトエンコーディングを使用するようになるとの情報がありました。
    • ColdFusion Administrator の [サーバーの設定]-[Java と JVM] 、または jvm.configファイル(例 C:\ColdFusion11\cfusion\bin\jvm.config)をテキストエディタで開き、上記の情報を JVM引数(jvm.configファイルでは java.args)に追加して下さい。
      (念のため、どちらの場合も jvm.config ファイルをバックアップしてから設定を追加されることをお勧めします)
       
  • VM引数に「-Dsun.nio.cs.map=Windows-31J/Shift_JIS」を追加する
    • VMの引数に上記を追加すると、エンコーディング名「Shift_JIS」が「Windows-31J(MS932)」の代替名として使用されるようになります。
    • この場合は、ColdFusion 11のファイルの自動判別機能を有効にしたまま利用できるメリットがありますが、もし、エンコードの「Shift_JIS」と「Windows-31J(MS932)」とを明示的に区別する必要がある場合には対応ができなくなる点には注意が必要です。
      • Shift_JISとWindows-31J(MS932)とでは一部特殊文字のコードポイントが異なる場合があります。Shift_JISとWindows-31J(MS932)のコードポイントをそれぞれ別々に処理をするようなプログラムを動かしているような場合は注意が必要です。
        (上記で紹介した参考リンク先にも説明が掲載されています)
        http://www.atmarkit.co.jp/ait/articles/0501/14/news118.html
    • ColdFusion Administrator の [サーバーの設定]-[Java と JVM] 、または jvm.configファイル(例 C:\ColdFusion11\cfusion\bin\jvm.config)をテキストエディタで開き、上記の情報を JVM引数(jvm.configファイルでは java.args)に追加して下さい。
      (念のため、どちらの場合も jvm.config ファイルをバックアップしてから設定を追加されることをお勧めします)

       
  • すべてのファイルに明示的に<cfprocessingdirective>タグでエンコードを明示する。または、BOM付きUTF-8でファイルを作成する

 

2016年11月17日追記

(補足)リクエスト済みのColdFusionページは、(デフォルトのキャッシュ設定で)実行ファイルがメモリとディスクにキャッシュされるため、上記のJVM引数の設定を行ってColdFusionを再起動しても、設定変更前のキャッシュをそのまま利用してしまい、結果的に文字化けが解消されない場合があります。

キャッシュの再作成が必要な場合は、下記のいずれかを行って下さい。

  1. 上記を設定して ColdFusionの再起動を行うタイミングで、キャッシュファイルを手動で削除する
    • ColdFusionページのキャッシュは、[CF root]\cfusion\wwwroot\WEB-INF\cfclasses に生成されています。ColdFusionのサービスを停止した後、フォルダ内に生成されているクラスファイル(*.class)を手動で削除して、その後 ColdFusion のサービスを起動して下さい。
       
  2. ColdFusion Administrator のキャッシュの設定で、コンパイル済みのキャッシュをクリアする
    • ColdFusion Administratorの [サーバーの設定] - [キャッシュ機能] ページの「テンプレートキャッシュをクリア」にある、『テンプレートキャッシュを直ちにクリア』ボタンをクリックすると、メモリにロードされているキャッシュがクリアされ、次回のリクエストでファイルから再コンパイルされます。
      • このボタンは、メモリキャッシュのクリアである事に注意が必要です。つまり、一旦ページがリクエストされ、メモリ内に実行ファイルがキャッシュされていないとキャッシュの再作成が行われません。例えばColdFusionのサービスを再起動してすぐにこの操作を行っても、問題となるページをリクエストしていない限りはメモリには実行ファイルがキャッシュがされていない(ColdFusionのサービスを再起動するとメモリのキャッシュは破棄されてしまう)ので、そのページのキャッシュの再作成が行われない事になります。より確実にキャッシュをクリアするには、1.のキャッシュファイルを手動で削除する方法をお勧めします。
         
  3. 該当するファイルを書き換える
    • ColdFusionページのリクエストの際、(デフォルトの設定では)ページの内容が変更されている場合はキャッシュを再生成します。そのため、この問題に遭遇するページが限定されている場合は、そのページをテキストエディタ等で開き、ファイルの内容を変更する(ファイルのタイムスタンプを更新する)事で、キャッシュを再生成します。

 

※記事のカテゴリを「ColdFusion 11情報」から「技術情報」に変更しました。


記事公開日:2015年02月18日
最終更新日:2016年11月17日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.