いつもお世話になります。
下記は、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
Vistaでは日本語文字の使用はいろいろ問題ありあり。MailToぷろとこるでは
UTF-8文字列とShift_JIS文字列との誤認による文字化けが怒るようで、
桜咲く、でなくて、回避策は URLエンコードらしい。
カイヒ咲く さん、ありがとうございました。
何とか回避できました。
以下ソースコードです。
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;
上記回避策では、Vista では正しく表示しましたが、
今度は XP で文字化けしてしまいました。
Windows2000/XP/Vista で共通のソースコードにならないものでしょうか?
プログラム中で OS を判断するしかないのでしょうか?
何かヒントまたは解決策がありましたら、よろしくご教授願います。
最初のコードをVistaで実行しても特に文字化けしませんでしたけど、
化けるかどうかはメーラによるんじゃないですかね。
試したのはWindows Mailです。
>…HttpEncode(UTF8Encode('<<テキスト本文>>'))…
UTF8Encodeは不要。ShiftJISのまま HttpEncodeだけならどう?
かみづ様、おやおや様、ありがとうございます。
上記テスト環境は、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 はサポートしたいと考えています。
よろしくお願い致します。
>...規定のメーラーが何であるかを知る方法って...
半月前に「解決」済み
それは様、ご指摘ありがとうございます。
私は、今まで下記のようなソースコードでレジストリ値を読み書きしてきました。
※キー値が見つからなかった場合の規定値が指定できて便利だったのでずっと使用していました。
しかし、この方法では 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;
同じマイクロソフト製品なのに、文字コードの扱いが違うってのは
いまいち納得できませんが、何とかなりそうです。
ありがとうございました。
今後ともよろしくお願い致します。
ツイート | ![]() |