- PR -

MailTo:で日本語が文字化けする

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-18 10:13
@PageディレクティブのcodePage属性。。。932か、x-sjis
ちがうかな?
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2003-12-18 10:21
Webアプリではないんですが…この前Winアプリ作っているときに。

コード:

using System;
using System.Text;
using System.Diagnostics;

...

byte[] buf = Encoding.GetEncoding("Shift-JIS").GetBytes("しふとじす");
StringBuilder sb = new StringBuilder();
foreach(byte b in buf)
{
 sb.Append( string.Format("%{0:x2}", b) );
}
Process.Start(string.Format("mailto:hoge@hoge.com?subject={0}", sb.ToString()));




OEだと文字化けしませんでした。
というか「URI を Shift-JIS で Escape」してもいいんですかね…ほんと。

ちなみに

コード:

Uri uri = new Uri("mailto:hoge@hoge.com?subject=ふつうにえすけーぷ");
Process.Start(uri.AbsoluteUri);




だと駄目です。

※後半追加

[ メッセージ編集済み 編集者: ya 編集日時 2003-12-18 10:40 ]

[ メッセージ編集済み 編集者: ya 編集日時 2003-12-18 10:41 ]
なか-chan@最愛のiMac
ぬし
会議室デビュー日: 2002/07/17
投稿数: 385
お住まい・勤務地: 和光市・世田谷区
投稿日時: 2003-12-18 10:25
Accessさん

単に、
<head>
<meta http-equiv="Content-Type" content="text/html; charset="Shift_JIS">
</head>
を追加してはどうでしょうか?
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-12-18 11:02
どもほむら@小言モードです。
--------
ところでその問題の結果はいったいどのような結果が返ってきていたのでしょうか?
基本的に、うまくいきません。ダメでした。といわれても回答者は何も想像できません。
また、同じでしたも同様にその前の段階がわからないのでなんともいえませんね。

確認に使用しているメーラーとブラウザは何を利用していたのでしょうか?
結果として出力されるページ(ブラウザのソース表示)でどのようになっていたのでしょうか?

もしよければ同様のケースに出くわした人の為にも、
どんなことが起こったのか、又それに対してどのような修正を行ったのか
その記述があるだけでもたとえ、解決はできなくても
スレッドとしての価値は高くなると思います。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2003-12-18 12:15
ほむらさんの意見には同意です。

で、こちらでも現象を確認しましたが、例えば
「subject=あいう」
としたときに化けて出てくる文字列は
「縺ゅ>縺」
ですか?だとすればこれはutf-8で書かれたものをshift-jisとして読んでいます。
なので少なくとも、「shift-jisで書かれています」といった記述をしても
だめだと思います。

>@PageディレクティブにresponseEncoding="shift-jis"
これで基本的にはshift-jisエンコーディングで出力されるはずです。うちの
IE6+OUTLOOKではちゃんと件名に「あいう」と入りました。でもこれよりは
Web.configを以下のように設定すればWebアプリ全体に適応されます。
<globalization responseEncoding="shift-jis" requestEncoding="shift-jis" />
(レスポンスとリクエストのエンコードは合わせたほうがいいと思います)

あと、リンク上にマウスを置いたときはちゃんと「subject=あいう」と出ませんか?
ブラウザは、あるところまではutf-8でも読めるが、utf-8で読めない(渡せない?)
箇所があるみたいです。ファイルダウンロードのダイアログでも似たようなことが
おきますよね確か↓
http://support.microsoft.com/default.aspx?scid=kb;ja;436616
(UrlEncodeだけしてもメール件名は文字化けしたままでした)
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2003-12-18 12:58
簡単な実験したので追加させてもらいます。
先ほどの例ですと、プログラム側からメーラーを起動しようとしたわけですが、このときはbodyを指定する必要があり(スペースとかが入る)エスケープが必須であったわけです。そのためUriクラスを使って普通にエスケープしたわけですが、文字化けが発生しました。それで独自にShift-JISでエスケープをしてやると(つまり先ほどのコード)うまくいったわけです。

で、この辺を踏まえてHTMLで少し実験してみました。meta(文字コード指定)とaタグのみの簡単なHTMLをつくってクリックしてメーラーを起動したときに文字化けするかどうかの結果です。


環境
IE 6.0, OutlookExpress, WindowsXPPro SP1

結果
1. HTMLファイル=UTF-8, URI Escapeなし 文字化け
2. HTMLファイル=UTF-8, URI Escape(標準)あり 文字化け
3. HTMLファイル=UTF-8, URI Escape(SJIS)あり 文字化けしない
4. HTMLファイル=Shift-JIS, URI Escapeなし 文字化けしない
5. HTMLファイル=Shift-JIS, URI Escape(標準)あり 文字化け
6. HTMLファイル=Shift-JIS, URI Escape(SJIS)あり 文字化けしない
※URI Escape(標準)とはUriクラスにエスケープしないUri Stringを渡し、エスケープしたもの。

考察
・Uri はメーラー(OE)からはShift-JISでエンコードされていると判断すると推測できる。
・Uri がエスケープされている場合、メーラー(OE)はShift-JISでエスケープを解釈すると推測できる(いったんバイト配列に直してから解釈しているか)。

結論
解決策としては
・HTML自体をShift-JISで生成し、URIをエスケープしない(条件として含みたい文字列に改行など変な文字列が入らないこと)。
・URIを独自にShift-JISでエスケープする(条件として長さ制限ぐらい?)。

C#ですいませんが…

コード:

string MyEscape(string uri)
{
 byte[] buf = Encoding.GetEncoding("Shift-JIS").GetBytes(uri);
 StringBuilder sb = new StringBuilder();
 foreach(byte b in buf)
 {
  sb.Append( "%" + b.ToString("x2") );
 }
 return sb.ToString();
}

void Page_Load(object sender, EventArgs e)
{
 string to="test@test.com";
 string subject="さぶじぇくと";
 string body="ぼでぃ";

 Hyperlink1.NavigateUrl = string.Format("mailto:{0}?subject={1}&body={2}", to, MyEscape(subject), MyEscape(body));
}




こんな感じでうまくいかないでしょうか?でもOE以外のメーラーの動作とかも考えると頭痛い問題です…。

[ メッセージ編集済み 編集者: ya 編集日時 2003-12-18 13:04 ]

[ メッセージ編集済み 編集者: ya 編集日時 2003-12-18 13:11 ]

[ メッセージ編集済み 編集者: ya 編集日時 2003-12-18 13:12 ]

[ メッセージ編集済み 編集者: ya 編集日時 2003-12-18 13:16 ]

[ メッセージ編集済み 編集者: ya 編集日時 2003-12-18 13:19 ]
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-12-18 16:09
ども、ほむらです。
僕の意見に反応して頂いたようでうれしく思うとともに
べる氏とya氏に感謝します。
(きっといろいろな実験をしていただけたのですよね)
-------
両氏の意見を参考して書かせていただくと
可能性として、UTF-8で送信(リクエスト)されたデータを
文字コードSHIFT-JISとして表示しているからということになるのでしょうか。

回避策としては
1.レスポンスとリクエスト時の文字コードを一致させる(べる氏)
2.リクエストデータをいったんSHIFT-JISに変換してから
  その変換したデータを自分でURLエンコードした形で出力する(ya氏)

ですか。。
文字コードの問題って難しいですよね。

#まるで別件ですがXSLTでHTMLを出力した時に文字コードではまったことがあります^^;;;

[ メッセージ編集済み 編集者: ほむら 編集日時 2003-12-18 16:10 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2003-12-18 20:39
引用:
1.レスポンスとリクエスト時の文字コードを一致させる(べる氏)

あ、わかりにくくてごめんなさい。
現状のIEでは、文字コードを一致させるといっても、レスポンスとリクエストを
両方utf-8にすると、このような現象は回避できないと思います。
レスポンスをshift-jisにするならリクエストもshift-jisにした方が無難ではないか
という意味で書いたのです。

#そういえば他のブラウザでは実験してなかったです、この手の現象。

スキルアップ/キャリアアップ(JOB@IT)