• 締切済み

機種依存文字(株)を入力すると\x{3231}に変換される

入力フォームより入力した文字を7bit-JISに変換してメールで送信するスクリプトをutf8で書いております。 eucでスクリプトを書いておりました時はjcode.plでJISコードに変換すると、(株)や髙の文字もそのままメールで送られておりました。 今回utf8でスクリプトを書きなおしますと、 (株)(一文字の機種依存文字のです) → \x{3231} 髙 → \x{9ad9} に変換されます... どのようにすると、このような機種依存文字もそのまま送信することができるでしょうか? スクリプトは下記のような感じです.. -------------------- use utf8; use Encode; use Encode::Guess; binmode STDIN, ':bytes'; require 'mimew.pl'; # $Mail_Head : メールヘッダ # $Mail_Data : フォームより入力された文字列 #JISコードに変換 $Mail_Data = &to_jis($Mail_Data); $Mail_Real = $Mail_Head.$Mail_Data; # メール送信 open(MAIL,"|$SendMailPath"); print MAIL $Mail_Real; close(MAIL); exit; sub to_jis { my $text = $_[0]; # ~、-など文字化け対策 $text =~ tr/[\x{ff5e}\x{2225}\x{ff0d}\x{ffe0}\x{ffe1}\x{ffe2}]/[\x{301c}\x{2016}\x{2212}\x{00a2}\x{00a3}\x{00ac}]/; return encode ('7bit-jis', $text); } -------- \x{3231}は $text =~ s/\x{3231}/(株)/; などで(株)に変換するとかいう対策ができるかと思いますが、 はしご高などはお名前に使われる文字ですし、そのまま送信したいのです。 よろしくお願いします!

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

use utf8していると、utf8フラグと向き合うことになりますので 引っかかりやすい部分はあると思います。 具体的にどのようなコードを書いてどんなエラーが出たとか補足していただけますか? #!/usr/bin/perl # -*- coding: utf8 -* use strict; use warnings; use Fatal qw(:void open close); use feature ':5.10'; use utf8; use Encode qw/from_to decode encode/; binmode STDIN, ':bytes'; my $str = "";#たぶんokwaveで変換しちゃうだろうけどはしご高。 my $outstr = encode('7bit-jis', $str, Encode::FB_PERLQQ); say $outstr; #→ \x{9ad9} #echo |nkf -S -j|hexdump #00000000: 1B 24 42 7C 62 1B 28 42 0A .$B|b.(B. $outstr =~ s/\\x\{9ad9\}/\x1b\x24\x42\x7c\x62\x1b\x28\x42/; say $outstr; こんな感じで、JISっぽい文字列にはしご高を埋め込めてます。 上記の出力を再度 nkf に食わせてsjisに戻すとsjisのはしご高になります。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>ところでEncodeではよっぽどがんばらないと(?)無理なんでしょうか... 配布されている状態のものではだめだと思います。 変換した後に、直接必要なパターン(あらかじめ求めておきます)に置換すれば可能でしょうけど。 リリースノート (Perl-Encode-ISO2022JPMS - 0.1) - Legacy Encoding Project - SourceForge.JP http://sourceforge.jp/projects/legacy-encoding/releases/22392/note このモジュール(Encode::ISO2022JPMS)を入れるか、あるいは同様のことを自分でやるというのも あるとは思いますが、それを質問者さんが許容できるかはちょっとわかりませんのでなんとも。

kiku_j
質問者

お礼

どうもありがとうございます。 >変換した後に、直接必要なパターン(あらかじめ求めておきます)に置換すれば可能でしょうけど。 はじめ http://ziddy.japan.zdnet.com/qa2291426.html?ans_count_asc=1 にsakusaker7さんが書いていらっしゃる1~4の手順でやってみようとしたのですが、どうもできなくて...use utf8してるからでしょうか...? Japaneseモジュールの使用で問題ないのですが、自分の勉強のためにやり方を知りたいと思いましたもので。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

面倒くさいので詳細は省きますが、Encodeモジュールではなく Unicode::Japanese などを使って変換すればいけそうな。 Unicode::Japanese - 日本語文字コード変換 http://tech.ymirlink.co.jp/perl/cpan/Unicode/Japanese.html

kiku_j
質問者

お礼

下記でできました!ありがとうございます! use Unicode::Japanese; sub to_jis { my $text = $_[0]; $text = encode ('utf8', $text); return Unicode::Japanese->new($text)->jis; } ところでEncodeではよっぽどがんばらないと(?)無理なんでしょうか...

関連するQ&A