前回も文字化けについて質問させてもらったものです。
回答者様のヒントのおかげでようやく変換するとこまでたどり着けました
ありがとうございました。
しかし、今回も文字化けについてなのですが・・・
my $Name =$q->param('Name');
Encode::from_to($Name, 'utf8', 'shiftjis'); #パソコンへ送る用
Encode::from_to($Name, 'shiftjis', 'iso-2022-jp'); #スマホへ送る用
$smtp->datasend("名前 : $Name\n\n");
①異字体が文字化けする(髙)(﨑)等
調べると
utf-8
Content-Transfer-Encoding: 8bit
というので処理するという結果が出たのですが
どこにどう記述するのかがわからないです。
②$smtp->datasend("名前 : $Name\n\n");
ここの「名前:」のとこが文字化けするのですが、
これはおそらく'iso-2022-jp'のまま送られているということだと思うのですが、
例えば、「名前:」という文字列を
my $Name =$q->param('Name');
$Nameの前につけて送信してほしいのですが、どのように記述するのでしょうか?
以上の2点についてをどうかご教示お願い致します。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
subject については
https://oshiete.goo.ne.jp/qa/9537567.html
を見ればいいよ... って, なんでこんなピンポイントに類似した質問が (異なるアカウントから) 出てくるのかなぁ.
No.4
- 回答日時:
複数のシステムがいろいろやってるっぽいから, 「完全に対処する」のは不可能かもしれないねぇ. 現状わかっていることは
・とりあえず PC では問題なし
・スマホでは文字化けする
というだけで, ここからは例えば
・実は「スマホ」が cp932 に対応していない
・メールを「スマホ」に送るために経由しているシステムで何なことをしているので問題が発生している
という可能性がすぐに思い浮かぶ (ほかにもあるかもしれん). 前者だったら単純に「cp932 にしない」で済むわけだが, 後者だと本質的にどうにもならんよね.
とりあえず「cp932 にしない」で済むことを祈るくらいかな.
ありがとうございます。
私がしっかりできていなく
my $header = <<"MAILHEADER";
From: $from
To: $mailto
CC: $mailcc
Subject: $subject
Mime-Version: 1.0
Content-type: text/plain;charset=ISO_2022_JP
Content-Transfer-Encoding: 8bit
MAILHEADER
Content-type: text/plain;charset=ISO_2022_JP
この部分を
↓
Content-type: text/plain;charset=Shift_JIS
こういう風に変えるとスマホでも、パソコンでも本文が文字化けされずに表示されました。
原因がわからないです;;
また、これにより今度は、件名subjectが文字化けするようになりました。
そこで、件名の文字化けで検索すると
use MIME::Base64;
を使うようなことを書いていたのですが、これで件名も対策できますでしょうか?
No.3
- 回答日時:
かなり大雑把に書いてしまいますが, 例えば「はしご高」は JIS (iso-2022-jp) には存在しません. 従って, iso-2022-jp に変換するならこのような「異体字」の問題は
あきらめる
しかありません.
というか....
最初から Unicode で得られているんだから, それをそのまま送っちゃえばいいんじゃないかなぁ. それに, utf-8 からわざわざ shift-jis を経由して iso-2022-jp にするのも意味不明だよねぇ.
まだまだ理解出来ていない部分が多いからよくわかならくなっています。。。
そのまま送るとこはそのまま送るようにしたら文字化けはなくなりました。
ただHTMLから受け取ったデータだけは下記で対処
Encode::from_to($Name, 'utf-8', 'cp932');
これでパソコンには文字化けはしなくなりました。
しかし、スマホで文字化けが発生してしまいます。
パソコン、スマホ両方に送れるようにするにはどうすればいいのでしょうか?
No.1
- 回答日時:
先のご質問での追記等を読ませていただいた際にも感じていましたが、文字化けの対症療法ばかりに気が向いていて、文字コード体系を理解していないのだと思います。
JIS、Shift_JIS、EUCなどの文字コード表をご覧になったことはありますか?
JISは各バイトの最上位ビットを使用していません。よって1バイトで表現できる最大値は16進表記でx'7F'です。
これに対し、Shift_JISやEUC、UTFは最上位ビットも使用します。よって各バイトで表現できる最大値は同様にx'FF'です。
で。インターネットの歴史にも関わることなので説明が長くなるため省きますが、20年以上昔の通信機器では「文字データは7ビットしか通さない」という物が多くあったのです。つまり8ビットデータを流すと最上位ビットが落ちてデータ化けを起こし受信先では0か1なのかを判別する術がなく復元できなくなるのです。主にこの影響を受けるのはメールとFTPでした。
そんなことがあってインターネット上へ文字データをそのまま流す際の基本は7ビット表現となっています。つまり日本語ならJISです。
しかしその後、1文字に2バイト以上を要する文字データを使用する地域でのインターネット利用が広がって来たことから文字送信時でも8ビット全部を通す機器が一般的となりました。
しかし、各所の仕様に7ビットまでだった時のなごりが残っています。
メールヘッダのContent-Transfer-Encoding:もその一つかと思います。
送信する文字は7ビット表記だよとか8ビット表記だよということを示すヘッダです。
JIS(Content-Type:行のcharsetがISO-2022-JP)以外の場合は8bitを指定します。
JIS(Content-Type:行のcharsetがISO-2022-JP)の場合は7bitを指定します。
---
プログラム中の"名前 : "の文字コードと、変数$Nameの中の文字列の文字コードが異なるだけの事です。
例えば$Nameに対し Encode::from_to($Name, 'utf8', 'shiftjis'); を行って送信しているのでしたら$Nameの中身はShift_JISです。
この状態で、、、
Content-Type: text/plain; charset="Shift_JIS"
Content-Transfer-Encoding: 8bit
として送信したメールを受信側で見ると"名前 : "が文字化けしているのであれば、"名前 : "はShift_JIS以外の文字コードで送信されたということになります。
この場合、8ビット表現を指定して送りましたから送信経路上での各バイトの最上位ビット落ちは無いはずです。
。。。といった具合に自身はプログラム上で何を指定したのか、それに対し何が起きてるのかを整理して行くことです。
プログラムは思った通りには動きません。あなたが作った通りに動いています。
障害を追う際はそのことを忘れない事です。
「へんだなぁ。これこれしかじかでうまく行くはずだよなぁ」と追うとなかなか原因にたどり着きません。
参考まで。
p.s.
確実に送信先を加味した文字コードに文字列変換するのであれば、「送信:」を$Nameに入れ、Webブラウザから送られて来たデータをその後ろにセットしてから文字列変換すればよいだけでは?
またのご回答ありがとうございます。
毎度ヒント頂きありがとうございます;;
>JIS、Shift_JIS、EUCなどの文字コード表をご覧になったことはありますか?
見たのですが、まだまだ基礎知識が備わっていないせいか、
見ても正直さっぱりです。。。
文字化けした文字を見てどれかな?って探す程度ですorz
>「送信:」を$Nameに入れ、Webブラウザから送られて来たデータをその後ろにセットしてから文字列変換すればよいだけでは?
これに関しましては、少し教えて頂いた形とは違うのですが、これのきっかけで
my $Name =$q->param('Name');
Encode::from_to($Name, 'utf8', 'shiftjis'); #パソコンへ送る用
Encode::from_to($Name, 'shiftjis', 'iso-2022-jp'); #スマホへ送る用
my $Name =$q->param('Name');
↓
my $HName = '名前 :';
my $Name =$q->param('Name');
Encode::from_to($Name, 'utf8', 'shiftjis'); #パソコンへ送る用
Encode::from_to($Name, 'shiftjis', 'iso-2022-jp'); #スマホへ送る用
Encode::from_to($HName, 'shiftjis', 'iso-2022-jp');
$smtp->datasend("$HName $Name\n\n");
という風にしました。
一応これで、パソコン、スマホ共に文字化けせず送れました。
ただ、zircon3様がご掲示くれているヒントと違えばまたご指摘お願い致します・・・
異字体に関しては、最初に記載くださった文字コード表が重要になってくるということですか・・・??
まだ理解がしっかりできていなく申し訳ないです;;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
- 大学受験 高校英語です。 関係詞の問題についてで The man whose name I always fo 1 2022/08/19 11:32
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「繝・せ繝・」となる文字化け
-
CGIでメールを送る際に文字...
-
MIMEでエンコードされたMailのS...
-
CASLIIの数値データ入出力
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
エクセルで数値を全角文字(カ...
-
スペースで区切られた氏名から...
-
住宅にカナを入力する際に丁目...
-
VBA 文字に半角が含まれて...
-
マクロを使ってフォルダー内に...
-
Excel VBAでPDFファイルをMicro...
-
VBで、String型のデータが、...
-
文字コードの%E3%80%とは何です...
-
VBA 置換文字がみつからない時
-
word差し込み印刷 半角カタカ...
-
エクセルで電話番号を取り出す...
-
EXCELからCSVにすると余計なカ...
-
「何とかで始まり、何とかで終...
-
CSVの定義
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonエラー
-
Perl:ファイル名だけ文字化けする
-
MIMEでエンコードされたMailのS...
-
1つのサイトで文字コードが混在...
-
「繝・せ繝・」となる文字化け
-
IMAP4でsubjectが検索ヒットしない
-
quoted-printableのアルゴリズム
-
メール(iso-2022-jp-2)のデコ...
-
Perl 文字化け
-
URLエンコードされたデータを戻...
-
perlの日本語文字コードはどう...
-
CASLIIの数値データ入出力
-
BASP21によるbase64のデコード...
-
文字コードの変換
-
標準入力からのutf-8→euc-jpで...
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
データにカンマが入ったCSVデー...
-
EXCELからCSVにすると余計なカ...
-
Excel VBAでPDFファイルをMicro...
おすすめ情報