最近は文字コードもUTF-8を利用する機会が多くなっている印象ですが、
未だにShift-JISを利用しているシステムも多くあるような気がしています。
最近嵌ったのですが、
cffileタグを利用してファイルを
Shift-JISで出力する時には注意が必要です。
Shift-JISにも複数種類が存在しており、下記の5種類が存在しています。
Shift-JISの種類について
種類 | 説明 | 呼び名 |
---|---|---|
Shift_JIS | オリジナルのShift_JIS | Shift_JIS |
NEC独自拡張Shift_JIS | NEC特殊文字などを加えたもの | PC-9800仕様OEM |
IBM独自拡張Shift_JIS | IBM拡張文字が加えられたもの | CP943C |
マイクロソフト標準Shift_JIS | NECとIBMのいいとこ取り ※大体これが使われている |
Windows-31J, MS932 |
アップル独自拡張Shift_JIS | ※使われない | Mac OS Japanese |
Shift-JISで出力する際には大体「マイクロソフト標準Shift_JIS」で出力されているみたいですが、
cffileタグで「Shift-JIS」で指定すると表の一番上の「オリジナルのShift_JIS」で
変換処理が実行されてしまうようです。
「Shift-JIS」と「MS932」とでそれぞれファイル出力を行うサンプルコードと実行結果については下記の通りです。
サンプルコード/実行結果
<cfset outputData = "㈱あいうえお①Ⅰ髙かきくけこ"> <!--- NG ---> <cffile action="write" file="filename1.txt" output="#outputData#" addNewLine="no" charset="shift_jis"> <!--- OK(※Linux環境などにおいては別途処理が必要) ---> <cffile action="write" file="filename2.txt" output="#outputData#" addNewLine="no" charset="MS932">
// Shift-JISを指定した場合 ?あいうえお???かきくけこ // Windows-31J またはMS932を指定した場合 ㈱あいうえお①Ⅰ髙かきくけこ
このように環境依存文字について「?」に変換されて出力されてしまっています。
◆対策ついて
Windows環境にColdFusionをインストールするとデフォルトでは
「MS932」が設定されている為、「charset=”MS932″」については
省略してしまっても大丈夫ですが、Linuxなどの他環境への移植も考慮して
「MS932」または「Windows-31J」と明記しておくと良いでしょう。
Linux環境ではデフォルトで「UTF-8」が指定されている為、
「Shift-JIS」を利用する時には「MS932」または「Windows-31J」を指定する必要があります。
※「MS932」または「Windows-31J」を利用するには別途作業が必要になります。
基本的にはUTF-8で出力すると思うのですが、
どうしてもShift-JISを利用しなければならない時には
気をつけておかないと痛い目を見ます(:3_ヽ)_