Next Page

1

Previous Page

Thread: =?iso-2022-jp?B?GyRCMTow・・・などとメールヘッダが化けたら戻せる?

Created on: 12/04/08 06:07 AM

Replies: 3

CFIF


半人前


Joined: 05/30/07

Posts: 38

=?iso-2022-jp?B?GyRCMTow・・・などとメールヘッダが化けたら戻せる?
12/03/08 4:45 PM

cfpopでdocomoケータイからの返信を受けたときに発生することが多いのですが、メールヘッダのsubjectが
=?iso-2022-jp?B?GyRCMTowQjtUTilMQDMkPi4bKEI=?=
などと化けてしまうことがあります。(化けるというよりエンコードされたまま?)

これをcf側でdecodeしようとしているのですが、
URLDecodeFormat(str , 'iso-2022-jp') など、それらしき関数ではうまくデコードできずにいます。

いろいろ調べていると、
http://masaka.dw.land.to/mr/mime.php
といった感じのphpサイトがありました。

ColdFusionで同じことができないでしょうか。

何か手がかりがあればお願い致します。

ColdFusion8.01 IIS7 の環境です。

Link | Top | Bottom

sussussu


長老


Joined: 05/31/07

Posts: 153

Re: =?iso-2022-jp?B?GyRCMTow・・・などとメールヘッダが化けたら戻せる?
12/04/08 11:00 AM

ちょっと調べてみました。

※書いてるうちに混乱してきて、どっちがデコードでどっちがエンコードだか解らなくなった状態でのコードなので、頭の整理ができたらテストしてまた改めて投稿します。

解決の糸口になるとは思いますので。

<cfset target = "浦安市立明海小">
#ToBase64(ToString(CharsetDecode(target, "iso-2022-jp")))#<br>
<cfset target = #ToBase64(ToString(CharsetDecode(target, "iso-2022-jp")))#>
#CharsetEncode(ToBinary(target), "iso-2022-jp")#<br>

----------------
suss:::-D::ussu
----------------

Link | Top | Bottom

sussussu


長老


Joined: 05/31/07

Posts: 153

Re: =?iso-2022-jp?B?GyRCMTow・・・などとメールヘッダが化けたら戻せる?
12/04/08 12:46 PM

頭の中を整理してみました。

元の文字と化けた後の文字をBase64でデコードしたりエンコードして、観察してるうちに化けた状態が再現できた。
→それを逆に書いたら復元できた。
というだけの事でした。

化けるに至った経路をもうちょっと追いかけると勉強になって詳しくなれそうです。:::-D::

#頭の整理に使ったコードを張っておきます

<cfsetting enablecfoutputonly="true">
<cfprocessingdirective pageencoding="utf-8">


<!---
問題のメールヘッダは以下の様に文字化けしている
=?iso-2022-jp?B?GyRCMTowQjtUTilMQDMkPi4bKEI=?=
--->

<cfset target = "浦安市立明海小">

<cfoutput>
考察: ISO-2022-JPでメールの文字化け<br>
<hr>


<p><b>受信したメールがどの様にして文字化けを起こしたのかは解らないが化けた後の文字列はtargetの様な状況である。</b></p>

target = "#target#"<br>

<cfset tmp="ToBase64(ToString(CharsetDecode(target, ""iso-2022-jp"")))">
"#tmp#" = "#Evaluate(tmp)#"<br>


<hr>

<p><b>上記で再現ができたので、これを元の文字列に復元する方法を考える。</b></p>

<cfset target = "#ToBase64(ToString(CharsetDecode(target, "iso-2022-jp")))#">

target = "#target#"<br>

<cfset tmp="CharsetEncode(ToBinary(target), ""iso-2022-jp"")">
"#tmp#" = "#Evaluate(tmp)#"<br>

<hr>

</cfoutput>

<cfoutput>
<table border="1" cellspacing="0" frame="box">
<tr>
  <td>CharsetDecode(string, "iso-2022-jp")</td>
  <td>指定されたエンコードを使用して、文字列をバイナリ形式に変換します。</td>
</tr>
<tr>
  <td>CharsetEncode(string, "iso-2022-jp")</td>
  <td>指定されたエンコードを使用して、バイナリデータを文字列に変換します。</td>
</tr>
<tr>
  <td>BinaryDecode(string, "Hex|UU|Base64")</td>
  <td>文字列をバイナリオブジェクトに変換します。 </td>
</tr>
<tr>
  <td>BinaryEncode(binarydata, "Hex|UU|Base64")</td>
  <td>バイナリデータを文字列に変換します。</td>
</tr>
<tr>
  <td>ToBase64(string または binary_object[, encoding])</td>
  <td>文字列またはバイナリオブジェクトをBase64表現に変換します。文字列の場合はエンコードを指定します。</td>
</tr>
<tr>
  <td>ToBinary(string_in_Base64 または binary_value)</td>
  <td>Base64 でエンコードされた文字列(またはバイナリオブジェクト)をバイナリ形式に変換します。バイナリ値をこの関数に渡すと、関数は入力値を返します。</td>
</tr>
<tr>
  <td>ToString</td>
  <td>指定されたエンコードを使用して、バイナリデータを文字列に変換します。</td>
</tr>
<tr>
  <td colspan="2">
  ToBase64() 関数よりもBinaryEncode()関数が推奨されている。<br>
  </td>
</tr>
</table>

</cfoutput>

----------------
suss:::-D::ussu
----------------

Link | Top | Bottom

CFIF


半人前


Joined: 05/30/07

Posts: 38

Re: =?iso-2022-jp?B?GyRCMTow・・・などとメールヘッダが化けたら戻せる?
12/04/08 3:07 PM

sussussuさん
ありがとうございます。

無事解決しました。


で、そもそもなぜ化けてしまうのか、原因がわかりましたので書いておきます。

docomoのsubjectって、全角15文字までしか扱えないんですね。
それを知らずに、

subject="12345あいうえおかきくけこさしすせそ"

などとしたメールをdocomoケータイに送ってしまっていたことが原因でした。
ダブルバイト文字が受信時にちょん切られてしまい、そのままdocomo側から返信すると化けてしまいます。

ちなみにソフトバンクは全角20文字。auは全角50文字がsubjectの制限とのことです。

:::-D:: :::-D::

Link | Top | Bottom

Next Page

1

Previous Page

New Post

Please login to post a response.