Vista での文字化けを回避するには?

解決


めるめる  2007-04-02 11:05:33  No: 25549  IP: 192.*.*.*

いつもお世話になります。

下記は、WinXP + D7Pro で作成した、メーラーを起動するプログラムです。
WinXP では特に問題なく動作していました。
このソースコードを、Vista で実行すると、タイトルや本文など、日本語
部分が文字化けしてしまいます。
回避する方法はないでしょうか?
それとも根本的にやり方が間違っているのでしょうか?
どなたか、ご教授いただけると幸いです。


uses
  ShellAPI;


procedure TForm1.Button1Click(Sender: TObject);
var
  Wstr: String;
begin
  Wstr := 'mailto:hoge@xxx.com?subject=TitleタイトルABC&body=';
  Wstr := Wstr + 'text:' + '%0d%0a';
  Wstr := Wstr + '<<テキスト本文>>' + '%0d%0a';
  Wstr := Wstr + 'ABCabc' + '%0d%0a';
  Wstr := Wstr + 'あいうえお' + '%0d%0a';
  Wstr := Wstr + 'ABCabc' + '%0d%0a';

  ShellExecute(0, 'open', PChar(Wstr), nil, nil, SW_NORMAL);
end

編集 削除
カイヒ咲く  2007-04-02 13:45:18  No: 25550  IP: 192.*.*.*

Vistaでは日本語文字の使用はいろいろ問題ありあり。MailToぷろとこるでは
UTF-8文字列とShift_JIS文字列との誤認による文字化けが怒るようで、
桜咲く、でなくて、回避策は URLエンコードらしい。

編集 削除
めるめる  2007-04-02 17:29:59  No: 25551  IP: 192.*.*.*

カイヒ咲く さん、ありがとうございました。
何とか回避できました。
以下ソースコードです。

uses
  ShellAPI, HTTPApp;

procedure TForm1.Button1Click(Sender: TObject);
var
  Wstr: String;
begin
  Wstr := 'mailto:hoge@xxx.com?subject=Title'
          + HttpEncode(UTF8Encode('タイトル')) + 'ABC&body=';
  Wstr := Wstr + 'text:' + '%0d%0a';
  Wstr := Wstr + HttpEncode(UTF8Encode('<<テキスト本文>>')) + '%0d%0a';
  Wstr := Wstr + 'ABCabc' + '%0d%0a';
  Wstr := Wstr + HttpEncode(UTF8Encode('あいう')) + '%0d%0a';
  Wstr := Wstr + 'ABCabc' + '%0d%0a';

  ShellExecute(0, 'open', PChar(Wstr), nil, nil, SW_NORMAL);
end;

編集 削除
めるめる  2007-04-02 17:43:24  No: 25552  IP: 192.*.*.*

上記回避策では、Vista では正しく表示しましたが、
今度は XP で文字化けしてしまいました。

Windows2000/XP/Vista で共通のソースコードにならないものでしょうか?
プログラム中で OS を判断するしかないのでしょうか?

何かヒントまたは解決策がありましたら、よろしくご教授願います。

編集 削除
かみづ  2007-04-02 19:01:11  No: 25553  IP: 192.*.*.*

最初のコードをVistaで実行しても特に文字化けしませんでしたけど、
化けるかどうかはメーラによるんじゃないですかね。
試したのはWindows Mailです。

編集 削除
おやおや  2007-04-02 20:46:57  No: 25554  IP: 192.*.*.*

>…HttpEncode(UTF8Encode('<<テキスト本文>>'))… 
UTF8Encodeは不要。ShiftJISのまま HttpEncodeだけならどう?

編集 削除
めるめる  2007-04-02 23:26:02  No: 25555  IP: 192.*.*.*

かみづ様、おやおや様、ありがとうございます。

上記テスト環境は、D7Pro でコンパイル、
・Vista + Outlook2007
・XP + Outlook2003
でした。

かみづ様のご指摘の通り、Vista + Windowsメール の環境では
最初のソースコードでの文字化けは発生しませんでした。
やはり、メーラー(Outlook2007)が原因のようです。

おやおや様のご指導の通り、UTF8Encode を外したところ、
Vista + Outlook2007 (NG)
Vista + Windowsメール (OK)
XP + Outlook2003 (OK)
XP + Outlook Express (OK)
という結果となりました。

とりあえず、HttpEncode だけ残して UTF8Encode を外し、
当面、Outlook2007 はサポート外の方向で考えます。

ところで、規定のメーラーが何であるかを知る方法ってあるのでしょうか?
できれば、Outlook2007 はサポートしたいと考えています。
よろしくお願い致します。

編集 削除
それは  2007-04-03 00:27:28  No: 25556  IP: 192.*.*.*

>...規定のメーラーが何であるかを知る方法って...
半月前に「解決」済み

編集 削除
めるめる  2007-04-03 02:24:21  No: 25557  IP: 192.*.*.*

それは様、ご指摘ありがとうございます。

私は、今まで下記のようなソースコードでレジストリ値を読み書きしてきました。
※キー値が見つからなかった場合の規定値が指定できて便利だったのでずっと使用していました。
しかし、この方法では HKEY_CURRENT_USER 以下の情報しか読み書きできません。
過去ログで検索してみると HKEY_LOCAL_MACHINE 以下を読み書きする方法がいろいろあるようなので、それを参考にトライしてみます。


  private
    { Private 宣言 }
    inifile : TRegIniFile;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // レジストリ読み込み
  inifile := TRegIniFile.Create('SoftWare\Corp-ID');
  With inifile do
  begin
    Label1.Caption := ReadString('Soft-ID', 'Data-NO', '規定値');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // レジストリ書き込み
  inifile := TRegIniFile.Create('SoftWare\Corp-ID');
  With inifile do
  begin
    WriteString('Soft-ID', 'Data-No',  Label1.Caption);
  end;
  inifile.free;
end;

編集 削除
めるめる  2007-04-03 12:24:56  No: 25558  IP: 192.*.*.*

同じマイクロソフト製品なのに、文字コードの扱いが違うってのは
いまいち納得できませんが、何とかなりそうです。
ありがとうございました。
今後ともよろしくお願い致します。

編集 削除