- ベストアンサー
perl+shiftjisで5c文字化けの対処方法について
DoCoMoの携帯向けサイト(shiftjis)をレンタルサーバのPerl+Mysqlで作成中ですが、特定文字(ソ、表など)で文字化けが発生します。今日も丸一日格闘しています。 ソや表などの5c系の文字化けの存在は分かるのですが、 Perlでの対処方法が良く分かりません。 いろいろ検索してみたら対処法として、 1.ソースのエンコードをshiftjisからEUCに変える 2.対象文字列をシングルクォーテーションで囲む 3.対象文字の後ろに¥記号をつけてエスケープする というのが一般的なようでした。しかし、 1.はDoCoMoの携帯はshiftjis指定なので除外になり、 2.は変数にHTMLデータを格納してその変数をprintしているため、シングルクォーテーションで囲うとHTMLタグが正常に表示されません 3.は膨大なデータの当該文字に直接¥マークをつけることは現実的ではありませんし、データベース内のデータは弄らずに設計した方が良いと思います。 上記の理由から今考えている対処方法は、5c系の40個の文字をループで回して、生成されるHTMLデータの入った変数の対象文字を置き換える方法になるのかとも思いましたが、冗長で処理が重くならないか心配です。 ちなみにphp版の場合は、Magic Quote GPCの値をONにして、 $正常な文字列 = stripslashes("Magic Quote された文字列"); としてやることで実現できました。 文字コードはHTML、perl、Mysqlすべてshiftjisで統一されています。 perlでこのような処理をする場合、1,2,3以外の対処法では、どのようにコーディングするのが良いでしょうか。perlと文字化けに詳しい方がおられましたら、お知恵をお貸しください。 【環境】レンタルサーバ,Apache:2.0.59, MySQL:4.0.26, PHP:5.2.1
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> Premature end of script headers: エラーが出ます。 このエラーはPerlスクリプトの記述によるエラーでは多分ありません。 この辺参照→ No.18450 RedHatLinux9のCGI動作で、「Premature end of script headers」エラーになる。 http://sakaguch.com/PastBBS/0037/B0018450.html > use encoding; としてみたところ、 > Unknown encoding のエラーが出たので use encoding のあとには、エンコーディングを指示するものが なければならないのにそれがないのでエラーになっています。 encoding.pmは5.8.xでは標準のものなので、 普通にインストールされていれば間違いなく存在しているものです。 ところで注意を一つ。 CPANにおかれているようなモジュールをばりばり 使うような場合、use encodingすることで スクリプトが期待通り動かなくなる可能性があります。 ですので、モジュールを活用しているのであれば 使用を避けるのが賢明だと思います。
その他の回答 (4)
- sakusaker7
- ベストアンサー率62% (800/1280)
とりあえず、試験用の簡単なスクリプトを作ってみて、 それが正常動作するか、あるいはPremature ... のエラーになるか確認してみてください。 use encoding の引数で与えられた引数のチェックは かなりゆるくできているので、Shift_JIS でも 大丈夫だとは思いますが、念のため #4でg_p_さんの書かれている通り、 別の、shiftjis とか sjis というパターンで試してみても いいかもしれません。
お礼
use encoding 'shift-jis'; と記述することで所望の結果を得られました。 >use encoding の引数で与えられた引数のチェックは >かなりゆるくできているので、Shift_JIS でも >大丈夫だとは思いますが、念のため・・・ この部分で、もしかしたら唯一無二の書式ではないのかも知れないと思い、イロイロ試してみた結果上記のパターンで上手く行きました。 文字コードをEUCで統一(HTML、CGI、Mysql)した場合、読み込んでいるcssやFlashなどの外部ファイルの扱いなどはどうなるのかなど多くの検証が必要ですが、近いうちに試してみたいと思います。ありがとうございました。
- g_p_
- ベストアンサー率53% (28/52)
use encoding qw(Shift_JIS); じゃなくて use encoding qw(shiftjis); じゃないですかね? 違ったらごめんなさい。 でも、もし DBI を使っておられるなら、sakusaker7 さんのおっしゃる通り 止めといた方が無難ですよ。 とっても面倒ですが、 スクリプトは euc で書いて、 入ってきたものは euc に、出て行く物は shift-jis に 変換するのが一番楽なのかも知れませんね。
お礼
use encoding 'shift-jis'; で実行できました。 >use encoding qw(Shift_JIS);じゃなくて >use encoding qw(shiftjis);じゃないですかね? ヒントになりました、ありがとうございます。 ご指摘のようにDBIを利用しているので、 文字コードをEUCで統一(HTML、CGI、Mysql)する テストもしてみたいと思います。 単純にファイルの保存形式を変えただけでは上手く行かない予感もしますが・・・。
- maniacpapa
- ベストアンサー率64% (9/14)
たとえば単に下記のようなスクリプトだと, #=========================================# # 文字化け例 (スクリプトはShift_JISで保存) #=========================================# $str = "表示"; print $str,"\n"; # 侮ヲ と表示される。 上記のように文字化けしますが, 下記のように書くと文字化けしません。 #=========================================# # 文字化けしない例 (スクリプトはShift_JISで保存) #=========================================# use encoding qw(Shift_JIS); $str = "表示"; print $str,"\n"; # 表示 と表示される。 Shift_JIS系の5C問題の解決には,いろいろなアプローチがありますが,そもそもShift_JISの入出力が前提でスクリプトもShift_JISで書かれるのでしたら,上記の方法がお勧めです。 use encoding qw(Shift_JIS); を使う際には,STDERRだけは指定した文字コードになりませんので,binmodeを使用してSTDERRの文字コードをShift_JISに指定しなおしてください。 これ系の文字化け問題を解決する一番の近道は内部的にリテラルをutf8フラグつきで処理するのが一番手っ取り早いですので,5.8系を使われているのでしたらぜひ試してみてください。
お礼
use encoding 'shift-jis'; と記述することで所望の結果を得られました。 説明が分かりやすく大変助かりました、ありがとうございます。 ▼テスト結果 ********************************************************** ■ソース $str = "ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚" print $str."\n"; ■結果 ャtトボール大会の会場使用瑞ソ書に主催者情報の赴L漏れ発覚 ********************************************************** ********************************************************** ■ソース use encoding 'shift-jis'; $str = "ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚" print $str."\n"; ■結果 ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚 **********************************************************
補足
ご回答ありがとうございます。 早速試してみたのですが、 use encoding qw(Shift_JIS); の一行を追加しただけで Premature end of script headers: エラーが出ます。 use encoding; としてみたところ、 Unknown encoding のエラーが出たので、これを使用するには どこかから encoding モジュール(?)を持ってこなければいけないでしょうか?それともこのレンタルサーバでは使用できないのでしょうか?
- kabaokaba
- ベストアンサー率51% (724/1416)
一番大事なPerlのバージョンと種類が不明 ・5.8系列ならencode系のモジュールを使う ・5.6系列ならあきらめる ・それ以外ならjperlを使う ・jcode.plの使用を考える ・ソースコードと吐き出すもののコードを変えてみる
お礼
利用するサーバが流動的なので、こういった情報は助かります。 また、5.8系列ならencode系のモジュールを使うということで、イロイロ調べて予備知識を得られたことは大きかったと思います。 ありがとうございました。
補足
申し訳ありません、抜けておりました。 Perlのバージョンは 5.8.0 です。
補足
>>Premature end of script headers: エラーが出ます。 >このエラーはPerlスクリプトの記述によるエラーでは多分ありません。 通常は use encoding qw(Shift_JIS); とすることで利用できるはずで、この一行を付加しただけでPremature end of script headers:エラーが出るということはレンタルサーバの運用者に問い合わせた方がよい ということでしょうか? あれからイロイロ調べて #!/usr/bin/perl -- と--をくっつけてみたりしたのですが、どうやってもエラーがなくなりません。