ColdFusion MXにて日本語の一部の文字が化けてしまうことについて
日本語のエンコーディングで ColdFusion MX を使用する場合に、特定の文字で問題となるケースについて説明します。
概要
ColdFusion MX は、Java によって実装されているため内部的な文字表現は Unicode が使われるようになりました。この事は多言語を扱う場合のメリットとなる反面、それぞれの国や OS のデフォルトのエンコーディングから Unicode への変換が行われるようになっておりこの変換によって一部の文字で問題が発生する場合があることが知られています。
Java では、日本語特有のエンコーディングとして SJIS, MS932, EUC_JP, ISO2022JP など(指定可能なエンコーディング名はこのほかにもそれぞれの名前にエイリアスが定義されているためもっと多くになります)が存在していますが、これらのエンコーディングと
Unicode とのマッピングだけを見ても、同じ形を持つ文字が Unicode の同じコードに対応していないケースがあるため場合によっては期待した文字が得られないことがあります。
また、この問題はベンダーによって Unicode とのマッピングが異なっている問題としても知られています。
回避策
エンコーディングとして UTF-8 を採用することでこれらの問題に遭遇する確率を下げることができます。特定のエンコーディングにこだわる必要が無い場合は、UTF-8 にすることを検討してください。UTF-8 を使わない場合は、文字化けが発生することがある文字はある程度 限られているので、それらの文字を使ってあらかじめテストを行い必要に応じて問題が発生しないように変換処理を行うことで回避可能です。サンプルコードはここからダウンロードできます。
文字化けが起こる可能性が高いとして知られている文字:

実際の問題の例:
-
波文字(〜)や、全角ハイフン(−)が ? となって表示される。
波文字(〜)や、全角ハイフン(−)は、エンコーディングによって Unicode へのマッピングが異なっていることで知られている文字の代表的なものです。入力時と出力時のエンコーディングが統一されているかどうか、あるいは入力時と出力時のエンコーディングが異なる場合は適切な変換を施すことで対処可能です。
入力時と出力時のエンコーディングが統一されていない例。
// Windowsで作成されたCFMファイル。シフトJISで書かれている
01: <cfcontent type="text/html; charset=SJIS">
02: <cfoutput>
03: <h1>1月〜</h1>
04: − 商品1<br>
05: − 商品2<br>
:
06: </cfoutput>以下は上記CFMファイルの実行結果です。
1月?
? 商品1
? 商品2〜を例に説明すると、次のような変換が行われた結果 ? となって出力されていることになります。
-
データベースに挿入した文字を取り出したときに正しく表示できない。
データベースサーバーによっては、Unicode のマッピングが異なっているため日本語のエンコーディングとの変換が不可逆になっており、登録した文字を取り出しただけでも文字化けが発生するケースがあります。
あらかじめ文字化けが発生するケースを調べておき、登録時あるいは取り出し時 それらの文字を表示可能な文字に変換することで回避できることがあります。
この問題は、お使いのデータベースや JDBC ドライバに依存するため実際の環境にて調べた後、対策を施す必要があります。 -
cfmailで送信したメールで 〜、− などが化けてしまう。
日本語のメールを送信する際には、iso-2022-jp(JIS)エンコーディングを使用するケースが多いと思いますが、MS932 と iso-2022-jp の Unicode へのマッピングの違いにより一部の文字が正常に送れないことがあります。
この問題を回避するためには、送信前に一部の文字を表示可能な文字に変換することで回避できます。
変換前 変換後 〜 FF5E 301C ‖ 2225 2016 − FF0D 2212 ¢ FFE0 00A2 £ FFE1 00A3 ¬ FFE2 00AC メールの本文が body 変数に格納されている場合、メールの送信前に次のようなコードを挿入することで正しく送信できます。
<cfset body=replace(body, "#chr(inputbasen("ff5e",16))#", "#chr(inputbasen("301c",16))#", "all")>
<cfset body=replace(body, "#chr(inputbasen("2225",16))#", "#chr(inputbasen("2016",16))#", "all")>
<cfset body=replace(body, "#chr(inputbasen("ff0d",16))#", "#chr(inputbasen("2212",16))#", "all")>
<cfset body=replace(body, "#chr(inputbasen("ffe0",16))#", "#chr(inputbasen("00a2",16))#", "all")>
<cfset body=replace(body, "#chr(inputbasen("ffe1",16))#", "#chr(inputbasen("00a3",16))#", "all")>
<cfset body=replace(body, "#chr(inputbasen("ffe2",16))#", "#chr(inputbasen("00ac",16))#", "all")><cfmail to="foo@bar.com" from="foo@bar.com" subject="test" type="text/plain; charset=iso-2022-jp">
#body#
</cfmail>
-
丸数字などが ? となって表示される。
丸数字や、一文字で表現された (株) などの文字は、日本語 Windows のデフォルトエンコーディングである MS932 でしかサポートしていないためです。エンコーディング名を指定する場合は、MS932 あるいは そのエイリアスである windows-31j を指定してください。
また、UTF-8 を利用することでも問題なく表示することが可能です。
追加情報
このテクニカルノートは、米国 Macromedia, Inc. の ColdFusion MX: How to test for and resolve corruption issues with certain Japanese characters(TechNote18624)をもとに作成されました。
