NMPOP3とNMSMTPコンポーネントを使って簡単なメールソフトをつくっています。
しかし、自分が作ったソフトを使って送信して、それをまた自分のソフトで受信を確認してみたのですが、件名が文字化けしてしまいました。
携帯に送信しても同じようなことになりました。
やはり、これはこちらのソフトの設計ミスになるんですよね?
『あいう』→『 「、』 というようになっていました。
また、他のパソコンから送られてきたものは『=?ISO-2022-JP?B?GyRCJCIkJCQmGyhC?=』となっていました。
文字化けに関していろいろ調べてみたのですが、文字化け部分を選択して貼り付けし、変換してくれるサイトは見つけられましたが、プログラム上で文字コードをうまく変換することはできるのでしょうか?
このような質問で申し訳ありません。
「jconvert.pas」というユニットを使えばたぶん解決できると思います。
googleあたりで検索するといっぱい出てきますので、そちらを参照してください。
jconvertだと、例えば、
Subject: =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNSQ3JDkkOyQ9GyhK?=
=?iso-2022-jp?B?GyRCJD8kQSREJEYkSCRKJEskTCRNJE4kTyRSJFUkWCRbJF4kXyRgGyhK?=
=?iso-2022-jp?B?GyRCJGEkYiRkJGYkaCRpJGokayRsJG0kbyRwJHEkciRzGyhK?=
という文字列が、
「あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん」
とならずに途中にスペースが入ったりしませんか?
もしくは、
Subject: =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNSQ3JDkkOyQ9GyhK?=
abc
=?iso-2022-jp?B?GyRCJGEkYiRkJGYkaCRpJGokayRsJG0kbyRwJHEkciRzGyhK?=
が、
あいうえおかきくけこさしすせそ abc めもやゆよらりるれろわゐゑをん
とならずに
あいうえおかきくけこさしすせそabcめもやゆよらりるれろわゐゑをん
となってしまったりしませんか?
・MIME文字列 plaintext文字列
・plaintext文字列 MIME文字列
・plaintext文字列 plaintext文字列
の場合、間の空白が必要です。
・MIME文字列 MIME文字列
の場合、間の空白は削除します。
吉岡さん、よしのさんありがとうございます。
jconvertを利用する場合はIndyも関係してくるのですか?
ただ、jconvert.pasを取り込んでコードを subject := jconvert.CreateHeaderString2(Edit1.Text) と
変更するだけでよいですか?
それとも他にもよい方法があるのでしょうか?
うぅ~よくわからなくて・・・すみません。
それから、これは受信の場合にもつかえるのでしょうか?
どうにもうまくいかないので・・・
# 「に」ですよ、「よ」でなく・・・^^;
jconvertにはIndyは関係ないと思います。
IndyのIdMessageには、日本語変換部分にバグがあります。
# 長い日本語をエンコードしたときに、改行がよけいに入ったり。
根が深いため、修正は難しいです。
jconvertにCreateHeaderString2ってあります?
私のPCに入っているjconvertには、CreateHeaderStringしか見あたりません。
CreateHeaderStringは、77文字制限がされていないので、そのままでは使えません。
P.S.
Indyは、前に薦めておきながら、使えなさそうです。
すみません。
# ほぼ自前で作り直しました。SMTPはまだですが
もう少し更新速度が速いと思ったんですが・・・。
やはりIndy10待ちでしょうか。
すみません、にしのさん・・・
お名前を間違えるなんて・・・ごめんなさい。
いろいろ調べていたら、PzConvというコンポーネントを見つけました!
まだ試してはいませんが、インストールして試してみようと思います。
メールの文字化けはやはり厄介なものですね・・・。
いろいろとありがとうございました。
きちんとできたらまたご報告したいと思います。
PzConvも、同じく77文字以上になってしまいますね。
77文字とはなんのことですか?
一応かたちだけなりました。
短い文字数でしか試していませんが・・・
あと、もうひとつお聞きしたいのですが
「かきく」と送ったものが「ゥォュ」となってしまうのは何コードなのでしょうか?
他のものはきちんと変換できたのですが、これだけ変換できなくて・・・
何度も何度もすみません。
77文字というのは、RFCに定義されています。
78文字以上だったかもしれません。
他にも、古いSMTPでは1000文字以上の行を許さないものがあります。
# SHOULDではなかったと思いますが、未確認です
こちらでは、
str := p.MIMEHeaderDecode(p.MIMEHeaderEncode('かきく'));
とやっても変換できています。
str := p.JisToSJis(p.SJisToJis('かきく'));
でも同じく正しく変換できています。
どこかでデータが変わってしまったという可能性はありませんか?
すみません、また説明が悪かったかもしれません。
今、受信して文字化けしたものを変換しているのですが、
通常は、iso-2022-jp・・・ や $$$・・・ といった文字化けなのですが、
これはMIMEHeaderDecodeとJisToSjisで変換できました。
しかし、「ゥォュ」(半角)となって(件名だけですが)受信したものは変換できなくて・・・。
やはりどこかで データが変わってしまったのでしょうか?
半角カタカナの「ゥ」と、全角カタカナの「ゥ」は全く違うコードですので、そのように書いて頂かないとこちらは全角カタカナとしか読みとれません。
詳しく書いた方がよいかと。
その3文字だけが書かれているのでしょうか。
予想ですが、
「ゥォュ」(半角カタカナ)
が、EUCコードと仮定して、それをSJISに直すと、
「自辞鹿」
となります。
意味のある言葉には見えませんので、どこかでデータが変わったのだと思います。
もう少し詳しく見てみました。
「かきく」
を、SJISコードに直すと、
82A9,82AB,82AD
「ゥォュ」(半角カタカナ)
を、EUCコードに直すと、
8EA9,8EAB,8EAD
1バイト目に、$0C(2進数で1100)が反転(もしくは加算)した状態です。
どこかで何か処理をしていませんか?
ふと思ったのですが、「ゥォュ」となる前のデータはどういう値でしょうか。
もしかして、jconvertのConvertJCodeで変換した後、PzConvで変換しています?
説明が下手で本当にすみませんでした。
しかも細かく調べていただいてありがとうございます。
自分の作ったソフトから自分宛に「かきく」と送信して、
受信してみると「ゥォュ」(半角)になってしまっています。
これは、受信してただけで何も変換しない状態です。
「あかさたな」と送ると「ゥウスネ」(半角)となってきました。
「かきく」に限らず、ほかの文字でも同じように化けています。
携帯に送っても同じ文字化けを起こしていました。
特に何も処理はしていないのですが・・・。
受信というより、この場合は送信時に問題があるのでしょうか?
jconvert.pasってそんなにバグだらけでしたっけ?
以前、簡単なメールソフトを作ったときに、SakmailJ2(だったかな)というVCLと併用して使ったときは、そんなに苦労しなかったような気がしますが・・。
http://www.vector.co.jp/soft/win95/prog/se178312.html
シェアですがこれなんかどうでしょう?
日本語もほとんどそのまま使えそうですよ。
シェアといっても1500円なので労力考えれば・・
原因は、SJISのままMIMEエンコードしているせいです。
SJISで
「あかさたな」
を、JISで開くと、
「...ゥ.ウ.ス.ネ」
となります。
# .は表記不能な文字コード。ゥウスネは半角カタカナ。
表記不能な部分をのぞいた、ゥウスネが表示された訳です。
先にJISに変換しておく必要があります。
もし、SJISのままMIMEエンコードしたいのであれば、
=?iso-2022-jp?B?
を、
=?shift-jis?B?
などに変えれば表示できるかもしれません。
# 未対応のメーラでは文字化けします
本当に何度もありがとうございます。
送信する前にJISに変換しておいたほうがよいということですよね?
実は、自宅のパソコンで自分のソフトを使ってメールを送っても
文字化けは起きないのですが、学校のパソコンから送るとあのような
文字化けをしてしまっていました。
今は自宅に帰ってきてしまって試すことができないので、
また明日学校に行って試してみようと思います。
本当にいろいろとありがとうございました。
できました!!!
送信する前に、件名をJISに変換するときちんと送れました!!
これでなんとか文字化け解消です!
本当にありがとうございました。
感激です!
長い時間お付き合いいただきましてありがとうございました。
ツイート | ![]() |