ColdFusionでの文字化け対策

| | コメント(2) | トラックバック(0)

ColdFusion MX は、Java によって実装されているため内部的な文字表現は Unicode が使われるようになりました。
それぞれの国や OS のデフォルトのエンコーディングから Unicode への変換が行われる時に、一部の文字で問題が発生します。
その対策。

・Macromedia ColdFusion : 18624 - ColdFusion MXにて日本語の一部の文字が化けてしまうことについて
http://www.macromedia.com/jp/support/coldfusion/ts/documents/jp_char_corruption.htm

1. 波文字(〜)や、全角ハイフン(−)が ? となって表示される。

● cfmファイルのコンパイル時
<cfprocessingdirective pageencoding="SJIS">
で指定した文字コードとして扱われる。
この文字コードから Unicode への変換が行われる。
Windowsでは、デフォルトエンコーディングは MS932。

● cfmの実行時
Unicode を、cfcontentタグで指定されている文字コードに変換します。

エンコーディングによって Unicode へのマッピングが異なっている文字があるため、コンパイル(入力)時と実行(出力)時で文字コードが一致していないと正しく変換がおこなわれない事があります。


2. データベースに挿入した文字を取り出したときに正しく表示できない。

3. cfmailで送信したメールで 〜、− などが化けてしまう。

日本語のメールを送信する際には、iso-2022-jp(JIS)エンコーディングを使用します。
MS932 と iso-2022-jp の Unicode へのマッピングの違いにより一部の文字が正常に送れないことがあります。

そこで、メールの本文が 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")>

4. 丸数字などが ? となって表示される。

エンコーディング名を指定する場合は、MS932 あるいは そのエイリアスであるwindows-31j を指定します。
または、UTF-8 を利用します。


トラックバック(0)

このブログ記事を参照しているブログ一覧: ColdFusionでの文字化け対策

このブログ記事に対するトラックバックURL: http://kinshachi.ddo.jp/mt/mt-tb.cgi/51

コメント(2)

Anonymous :

4. 丸数字などが ? となって表示される。

の問題なんですが、

cfmailでMS932の機種依存文字を使用すると、文字化けを起こします。MX以前のバージョンではWindowsの環境でメールを見れば、機種依存文字でも文字化けを起こさなかったように思います。

MS932 と iso-2022-jp の Unicode へのマッピングの違いでもないようですし…

メール自体はiso2022jpで配信したいのですが、且つ(Windowsの環境で)機種依存文字を文字化けさせない方法はあるのでしょうか?

ike :

名無しさん。
誰かからコメントが付く (or これから付く) 事を期待していたのですが、今のところ何もつかないくて寂しいのでとりあえずコメントを。

私はCFMXの環境が手元にないので動かして試せない状態です。
私がCFを触ってたのは3.0、4.0、4.5あたりで、MXはほとんど触っていません(機会があって、入れてちょっと触ったんだっけな?)。

直接の解決にはなりませんが、以下のコードを実行するとどうなるでしょう?
To宛てに「丸1」が書かれたメールを送れるのかなぁと期待してるんですが。

**********
<CFSET MAIL_BODY="#Chr(InputBaseN("E291A0",16))#">
<CFMAIL to="foo@example.jp" from="boo@example.jp" subject="test" type="text/plain; charset=iso-2022-jp">
#MAIL_BODY#
</cfmail>
**********

うぅーん。これだとchr関数かInputBaseN関数でエラーになります?
もし、エラーだったら、CFSET部分を以下の様に変えて試してもらえますか?

********** 別の方法 **********
<CFSET MAIL_BODY= chr(InputBaseN("E291",16))>
<CFSET MAIL_BODY= MAIL_BODY & chr(InputBaseN("A0E2",16))>
<CFSET MAIL_BODY= MAIL_BODY & chr(InputBaseN("91A1",16))>
*******************************

(↑かなり強引にやってます・・・)

要は(Javaで内部処理中の時)「0xE2 0x91 0xA0」となってる文字を送ったらどうなるかを知りたいんです。
奇数バイトでまずいなら「0xE2 0x91 0xA0 0xE2 0x91 0xA1」にしてみるとか(別の方法の場合)。

メールの内容の意味が通ればいいのであれば、送信前に丸数字を(1)(2)・・・などに置換するという方法もありそうですね?
どこかでこういう解法が紹介されてた記憶があります。
PHPのMLだったかな?

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、ikeが2003年9月 5日 22:14に書いたブログ記事です。

ひとつ前のブログ記事は「collector」です。

次のブログ記事は「ダイナミックDNS下での NameVirtualHostの設定」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近のコメント

On ColdFusionでの文字化け対策
  • ike: 名無しさん。 誰かからコメントが付く (
  • 匿名: 4. 丸数字などが ? となって表示され
Powered by Movable Type 4.261