- ベストアンサー
数字の文字化けについて
Perlで書かれたショッピングカートCGIを使用していて、 注文があると、注文内容の控えメールを 自動でお客様に送信するようになっているのですが、 そこに振込先の銀行口座番号を記載しています。 ----------------------- イーバンク ワルツ支店 (普)******* ノビ ノビタ ----------------------- 上のように記載した場合は文字化けしないのですが、 下のように記載するとハイフンを含む前半部分の数字が文字化けします。 (*は半角の数字です) ----------------------- ゆうちょ銀行 *****-****** ノビ ノビタ ----------------------- スクリプトはShift-JISで書かれています。 口座番号を記載しているのは、 $mailbody .= <<EOD; この間です。 EOD 文字化けすると困る箇所なので、原因と解決方法をご存知の方がいらっしゃいましたら 教えていただけますと助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SJISで全角スペースの文字コードは 0x8140(\x81\x40) です。 0x40 はPerlで配列変数の接頭辞を表す @ に相当します。 Perlではスクリプトソースコード中のダブるクォート定数文字列内に 含まれている変数は展開挿入されてしまいますので \x40 以降に 変数として使用可能な文字列が続いている場合、それを配列として 展開挿入してしまいます。 そのため、あまり全角スペースを直接使用するのは好ましくないです。 SJISのまま全角スペースを表現したい場合は "\x81\x40" のように するかシングルクォートにして展開挿入しないようにするか、 外部ファイル化してopenなどで読み込むかなどをしないといけません。 これはバックスラッシュ問題と同様のPerlスクリプトをSJISで書いた 場合の問題です。 ヒアドキュメントで << の後に付ける文字列をクォートで囲まない 場合、ダブルクォートと等価になりますので、次のようにシングル クォートで囲んでみてください。 $mailbody .= <<'EOD'; この間です。 EOD
その他の回答 (1)
- okmotokun
- ベストアンサー率59% (92/155)
数字の直前に "全角空白" がありませんか。 考えられる原因はこれくらいです。
お礼
ありがとうございます。 全角スペースを消したら、文字化けしなくなりました。
補足
ご回答ありがとうございます。 はい、全角のスペースが入っています。 そうですか、そのせいなのですね。 イーバンクの方も(普)の前にスペースが入っているのですが、 次に来る文字が日本語ならば大丈夫なのですね。 全角スペース+数字がダメなのでしょうか。 全角スペースを消して試してみます。ありがとうございました。
お礼
ありがとうございます。 今回は、全角スペースを入れなくても構わないので、取ろうと思いますが、 教えていただいた方法を試したら、文字化けしなくなったので、 次にこういった機会がありましたら、活用させていただきたく思います。 大変ご丁寧なご回答をありがとうございました。