- PR -

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

投稿者投稿内容
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2003-12-18 20:40
今日早出の出張から帰ったらレスがたくさんあったのでびっくりしました。

先に結論ですが、私が作成した.ASPXファイルはUTF-8の形式ですからSHIFT-JISで
エスケープすることにしました。これで、文字化けがなくなりました。

みなさんありがとうございました。

参考までに以下のコードは、WinXP, ASP.NET 1.1, IE6, Outlook 2003で動作を確認
しました。
コード:
Sub Button1_Click(sender As Object, e As EventArgs)
  Dim strLinkText As String
  Dim strRecipient As String = txtTo.Text
  Dim strSubject As String = txtSubject.Text
  Dim strBody As String = txtBody.Text
    
  strLinkText = String.Format("mailto:{0}?Subject={1}&Body={2}", _
    strRecipient, EscapeSjis(strSubject), EscapeSjis(strBody))

  Hyperlink1.NavigateUrl = strLinkText
  Hyperlink1.Visible = True
End Sub

Function EscapeSjis(ByVal uri As String) As String
  Dim buf() As Byte =  Encoding.GetEncoding("Shift-JIS").GetBytes(uri) 
  Dim sb As StringBuilder =  New StringBuilder() 
  Dim b As Byte
     
  For Each b In buf
   sb.Append("%" + b.ToString("x2"))
  Next
  Return sb.ToString()
End Function


Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2003-12-18 20:50
引用:

ほむらさんの書き込み (2003-12-18 11:02) より:
ところでその問題の結果はいったいどのような結果が返ってきていたのでしょうか?
基本的に、うまくいきません。ダメでした。といわれても回答者は何も想像できません。
また、同じでしたも同様にその前の段階がわからないのでなんともいえませんね。

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


今日、早出の出張で時間がなかったもので詳しい現象を説明しないで申し訳ございませんでした。回答者への配慮がたりなかったようです。

WinXP, ASP.NET 1.1, IE6, Outlook 2003の環境でテストしたのですがyaさんの
#1の条件(HTMLファイル=UTF-8, URI Escapeなし)で文字化けしたようです。

Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2003-12-19 08:26
引用:

なか-chanさんの書き込み (2003-12-18 10:25) より:
単に、
<head>
<meta http-equiv="Content-Type" content="text/html; charset="Shift_JIS">
</head>
を追加してはどうでしょうか?


metaタグにcharset="Shift_JIS"を指定しても日本語が文字化けします。
やはり、.aspxファイルがUTF-8のときは、Shift-JISでエスケープするしか
ないようです。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2003-12-19 08:43
引用:

yaさんの書き込み (2003-12-18 12:58) より:
簡単な実験したので追加させてもらいます。

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

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


yaさんサンプルコードまで提供していただいてありがとうございます。
問題を解決するアプローチを勉強させていただきました。

yaさんの手法を採用するとほとんどの問題が解決しそうな気がします。

ところで、.html, .asp, .aspxファイルをShift-JISで作成するにはどうすれば
よろしいのでしょうか。私は、.aspxファイルをメモ帳で作成しましたが、
ANSI, Unicode, Unicode big endian, UTF-8の形式しかないようです。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2003-12-19 09:04
引用:

べるさんの書き込み (2003-12-18 12:15) より:

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


web.configを確認したら、
<globalization responseEncoding="UTF-8" requestEncoding="UTF-8" />
になっていました。
以下のように、shift-jisに書き換えたら件名をShift-JISでエスケープしなくても
文字化けしません。
<globalization responseEncoding="shift-jis" requestEncoding="shift-jis" />
参考までに、このweb.configを使用すると.aspxファイルをUTF-8形式で保存しても
Shift-JISでエスケープしなくても文字化けしませんでした。

日本語を使用するときは、web.configを
<globalization responseEncoding="shift-jis" requestEncoding="shift-jis" />
のように設定した方がトラブルを未然に防止できるようです。

P.S.
Web Matrixの無償Webホスティングのように英語版のWindows Server 2003で運用されているときは、shift-jisに設定すると別の問題が発生しそうな気がします・・・
理由は思い出せませんが、一度shift-jisからutf-8に戻した記憶があります。


[ メッセージ編集済み 編集者: Access 編集日時 2003-12-19 09:14 ]

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