- ベストアンサー
(株)の変換について
(株)の変換についてお聞きしたいのですが、よろしくお願い致します。 問い合わせフォームに会社名を入力するところがあるのですが、入力する際に(株)を一文字で入力する方が多く、入力フォームの内容をメールで飛ばす際に、文字化けしてしまいます。 何とかそのような文字を変換して普通の(株)にしたいと思っているのですが、ネットで色々調べてもよくわかりません。 Perlのバージョンは、5.8.6です。 よろしくお願いいたします。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>入力文字列をjis→eucに変換後 自分でもお書きになってますが、この変換の時点で'?'とかゲタ(〓)への置換が 行われてしまっていますから、 その後でどうにかしようとしても無駄な努力です #というのは#8の方の回答にある通り そしてこれまた#8の方の回答の重複ですが ・入力フォームの記述に使っているコードはJIS ・EUCに変換しているのはこの(株)などのチェックのため ということでいいですか? とりあえず入力フォームはJIS(とSJIS)以外にしといたほうが面倒がないと思います。
その他の回答 (8)
- bgbg
- ベストアンサー率53% (94/175)
> 入力フォームがJIS形式で作成してあり、Perlのプログラムに入力文字を取り込んだときにeucに変換しているということです。(そしてメール送信します。) 普通は逆だと思うのですが…(フォームがSJIS or EUCで、JISに変換してメール送信) そのような仕様を要求されているのであれば申し訳ありません。それともJIS->EUC->JIS->メール送信? JISコードの文字を単純に置換演算子で置換しようとしても、うまくいかない場合があります。エスケープシーケンスを適切に付与・削除しないと文字化けしますし、その後EUCに変換もできません。 (株)を置換したいなら、フォームを別の文字コード(できればEUC)で作成すべきだと思われます。そうすれば#2で参考しているページを見ながら置換スクリプトを組むことができるでしょう。 (他の機種依存文字も考えると、機種依存文字の入力を受付けないようにするのが安全と言えば安全なのですが) また、上手くいかない場合は、上手くいかない状態を再現できるソースを貼りましょう。その方が的確な回答がつきやすくなるでしょう。
お礼
bgbgさんありがとうございます。 JIS->EUC->JIS->メール送信の方です。 入力フォームをEUC形式にしてテストしてみました。 No.2で書いているサイトを参考に抜き出して作成してみました。 入力内容をnameとvalueに分けた後、会社名が入っているところを抜き出して変換しています。(文字数制限のため省略しています) if ($name eq 'kaishamei'){ #----- %conv_table を初期化 ---- &init_table; #----- アスキーコード・EUC の2バイト・EUC の3バイトの正規表現 ----- $ascii = '[\x00-\x7F]'; $twoBytes = '[\xA1-\xFE][\xA1-\xFE]'; $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; $pattern='\x8E[\xA0-\xDF]|[\xAD\xAE\xF9\xFA\xFB\xFC][\xA1-\xFE]'; $value =~ s!\G(($ascii|$twoBytes|$threeBytes)*?)($pattern)! $1$conv_table{$3}!g; } '============= 'サブルーチン sub init_table { '中身省略 } この後、メール送信するためにJIS形式に変換し、メールを送ったらちゃんと3文字の(株)に変換されました!!バッチリです!! 長い間お付き合い頂き、ありがとうございました!!
- sakusaker7
- ベストアンサー率62% (800/1280)
>2.6にあげて試してみましたが いえ、逆です。 変換できるとしたらむしろ古いバージョン(0.88とか)のほうです。 ただし本当にできるかどうかは未確認です。 > 入力データに対して最初に自分で(株)を置き換えてやってから 文字コードの変換をしてやるのがよいように思います。 >これができればいいのですが、置換演算子を使って試したのですが、うまくいきませんでした。 > もしやり方をご存じでしたら、教えてください。 差し支えなければその置換を試みている近辺の数行を見せてもらえますか? おそらく、スクリプトで想定しているエンコーディング(euc-jpとかsjisとか)と 実際に入ってきているデータのつじつまが合わないためではないかと思うのですが。
お礼
sakusaker7さんありがとうございます。 入力フォームに入力した文字をまずname部分とvalue部分に分けてからそれぞれjisからeucに変換しています。 変換後をeucで出力したら(株)が?になっていました。 なのでそれを置換してもうまくいっていないみたいです。 入力文字列をjis→eucに変換後、 $value =~s/ '(株)' / '(株)' /; このようにしています。 すでに?になっているものを置換しているので、これではうまく行かないだろうなあと思いながら。。。 (その直後に出力したらやはり?でした) よろしくお願いいたします。
- sakusaker7
- ベストアンサー率62% (800/1280)
#4 の専門家様 ご高説ごもっともですが、質問文と#2のお礼を読む限りでは もとから質問者さんは(一文字の)(株)を問題なく送信できる形にしたいように 思えるのですが? ここから質問者さん宛 jcode.plではなくjcode.pmをお使いとのことですが、わたしの知る限りでは jcode.pmでは問題の(株)とかローマ数字のようなものの変換はできませんし、 (株)(一文字のもの)を( 株 ) の組み合わせに置き換えるようなこともしてくれなかったと記憶しています。 jcode.plでもやってくれたかは疑問なんですが。 ということで、 > Perlのプログラム上で(株)(一文字)をそのまま入力してそれを処理変換するとうまくいきます > (かっこ株の3文字になります)が、フォームから入力した(株)(一文字) > を取り込んで処理しようとすると、変換ができません。 この両者でPerl本体とかJcode.pmのバージョンが違うとかありませんか? とはいえ、入力データに対して最初に自分で(株)を置き換えてやってから 文字コードの変換をしてやるのがよいように思います。
お礼
sakusaker7さんありがとうございます。 Perlのバージョンは5.8.6です。 確認したらJcodeのバージョンは古かったので、バージョンをあげればいいと言うことでしょうか? 2.6にあげて試してみましたがやはり(株)の部分が?になってしまって、変換されませんでした。 > 入力データに対して最初に自分で(株)を置き換えてやってから 文字コードの変換をしてやるのがよいように思います。 これができればいいのですが、置換演算子を使って試したのですが、うまくいきませんでした。 もしやり方をご存じでしたら、教えてください。 よろしくお願いいたします。
- rafysta
- ベストアンサー率45% (24/53)
いわゆる環境依存文字の変換についてですが、このことについて詳しく解説されている方のホームページを参考URLにあげておきましたので、ご参考ください。 参考URLにある"conv-wrong-char.cgi"は、(株)を含む、すべての環境依存文字を変換する素晴らしいプログラムです。
お礼
rafystaさんありがとうございます。 No.2のお礼でも書いていますが、このサイトを見て試行錯誤しています。 参考にしていますが、うまくいかず、悩んでいます。
- bgbg
- ベストアンサー率53% (94/175)
質問者さんが作成しているページがメールフォーム(フォームから入力した文字をJISに変換しメール送信、受取側でeucに変換)とみなして、回答いたします。 一般的な電子メールでのJIS形式(ISO2022-JP)では、1文字の(株)という文字は存在しません。 存在するとしてもMicrosoftが独自に策定した文字コード体系です。 参考:http://ja.wikipedia.org/wiki/ISO-2022-JP#ISO-2022-JP.E3.81.A8.E6.A9.9F.E7.A8.AE.E4.BE.9D.E5.AD.98.E6.96.87.E5.AD.97 フォームでJIS形式に変換する前に機種依存文字をはじく処理を追加するのが尤も良い実装かと思います。
お礼
bgbgさんありがとうございました。 > フォームから入力した文字をJISに変換しメール送信、受取側でeucに変換)とみなして ではなく、入力フォームがJIS形式で作成してあり、Perlのプログラムに入力文字を取り込んだときにeucに変換しているということです。(そしてメール送信します。) > フォームでJIS形式に変換する前に機種依存文字をはじく処理を追加するのが尤も良い実装かと思います。 このようなやり方も一つの手ですね。 ですが、(株)や、(有)の判別もできたらいいなあと思っています。
- sakusaker7
- ベストアンサー率62% (800/1280)
変換に使っているのは jcode.pl ですよね? jcode::getcode(\$value); としたときの結果を教えてください。 $valueが変換されるのではなくて、推測結果が返ってきますので &jcode'getcode(*line) Return 'jis', 'sjis', 'euc' or undef according to Japanese character code in $line. Return 'binary' if the data has non-character code. 適当に出力してください。
お礼
sakusaker7さん、回答ありがとうございます。 使っているのはJcode.pmの方です。 レンタルサーバの関係からこれを使っています。 この場合でHTML出力した場合は、 (株)一文字のところが、?で表示されています。 その場合、メールを送ったときの文章にも同じように表示されます。 jcode::getcode(\$value); でやってみましたが、なにも表示されなくなってしまいました。 よろしくお願いいたします。
- genkivogue
- ベストアンサー率22% (4/18)
- 参考URL:
- http://u5.to/qJGfO
お礼
genkivogueさん、回答ありがとうございました。 教えて頂いたURLの一番上のページ(http://x68000.q-e-d.net/~68user/webcgi/char-code-2.html)を見ながら今まで試行錯誤をしてやっていたのですが、私が作成している問い合わせフォームはJIS形式で作成してあり、Perlで処理するときに入力文字をeucに変換しているのですが、その変換がうまくいかないみたいです。 Perlのプログラム上で(株)(一文字)をそのまま入力してそれを処理変換するとうまくいきます(かっこ株の3文字になります)が、フォームから入力した(株)(一文字)を取り込んで処理しようとすると、変換ができません。 &Jcode::convert(\$value,'euc'); ↑のように入力文字を変換しているのですが。。。 参考にしていたサイト(http://x68000.q-e-d.net/~68user/webcgi/char-code-2.html)では、入力フォームがeuc形式でPerl処理もeucだからうまくいくのかなあ?? と、よくわからなくなっています。 もしおわかりでしたら教えてください。 よろしくお願いいたします。
- shimix
- ベストアンサー率54% (865/1590)
>そのような文字 一般的には個別対応ですね。入力される可能性のある文字をひとつひとつチェックして置換することになります。 #私が(簡単な方法を)知らないだけかも・・
お礼
shimixさん、お返事ありがとうございます。 普通に置換をしてみたのですが、うまくいきませんでした。 具体的にどのようにするか方法を教えて頂いてもいいでしょうか?
お礼
sakusaker7さんありがとうございます。 No.8にも書いてありますが、入力フォームをEUC形式にしてテストしてみました。 > EUCに変換しているのはこの(株)などのチェックのため ではなく、Perlのプログラムで処理しやすいようにです。 うまくいきました。長い間お付き合い頂き、本当にありがとうございました!! またよろしくお願い致します♪