
前回も文字化けについて質問させてもらったものです。
回答者様のヒントのおかげでようやく変換するとこまでたどり着けました
ありがとうございました。
しかし、今回も文字化けについてなのですが・・・
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
Strawberry Perl for Windows ...
-
perlのプログラミング 部分入れ...
-
Perlでファイルの末尾から指定...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonエラー
-
文字コードについて
-
BASP21によるbase64のデコード...
-
jisコードで16進数の『3c』か...
-
メール(iso-2022-jp-2)のデコ...
-
quoted-printableのアルゴリズム
-
IMAP4でsubjectが検索ヒットしない
-
CASLIIの数値データ入出力
-
標準入力からのutf-8→euc-jpで...
-
Perl:ファイル名だけ文字化けする
-
文字コード? 推奨UTF-8?
-
エンコード方法についての質問
-
Jcodeモジュールの代わりにjcod...
-
1つのサイトで文字コードが混在...
-
メールを文字化けしないように...
-
「繝・せ繝・」となる文字化け
-
Lite.pmを使ったメールで文字化け
-
MIMEでエンコードされたMailのS...
-
perlの日本語文字コードはどう...
-
Encodeモジュールで日本語化したい
おすすめ情報