• ベストアンサー

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

  • Perl
  • 回答数5
  • ありがとう数4

質問者が選んだベストアンサー

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

> 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することで スクリプトが期待通り動かなくなる可能性があります。 ですので、モジュールを活用しているのであれば 使用を避けるのが賢明だと思います。

banana_c
質問者

補足

>>Premature end of script headers: エラーが出ます。 >このエラーはPerlスクリプトの記述によるエラーでは多分ありません。 通常は use encoding qw(Shift_JIS); とすることで利用できるはずで、この一行を付加しただけでPremature end of script headers:エラーが出るということはレンタルサーバの運用者に問い合わせた方がよい ということでしょうか? あれからイロイロ調べて #!/usr/bin/perl -- と--をくっつけてみたりしたのですが、どうやってもエラーがなくなりません。

その他の回答 (4)

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

とりあえず、試験用の簡単なスクリプトを作ってみて、 それが正常動作するか、あるいはPremature ... のエラーになるか確認してみてください。 use encoding の引数で与えられた引数のチェックは かなりゆるくできているので、Shift_JIS でも 大丈夫だとは思いますが、念のため #4でg_p_さんの書かれている通り、 別の、shiftjis とか sjis というパターンで試してみても いいかもしれません。

banana_c
質問者

お礼

use encoding 'shift-jis'; と記述することで所望の結果を得られました。 >use encoding の引数で与えられた引数のチェックは >かなりゆるくできているので、Shift_JIS でも >大丈夫だとは思いますが、念のため・・・ この部分で、もしかしたら唯一無二の書式ではないのかも知れないと思い、イロイロ試してみた結果上記のパターンで上手く行きました。 文字コードをEUCで統一(HTML、CGI、Mysql)した場合、読み込んでいるcssやFlashなどの外部ファイルの扱いなどはどうなるのかなど多くの検証が必要ですが、近いうちに試してみたいと思います。ありがとうございました。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.4

use encoding qw(Shift_JIS); じゃなくて use encoding qw(shiftjis); じゃないですかね? 違ったらごめんなさい。 でも、もし DBI を使っておられるなら、sakusaker7 さんのおっしゃる通り 止めといた方が無難ですよ。 とっても面倒ですが、 スクリプトは euc で書いて、 入ってきたものは euc に、出て行く物は shift-jis に 変換するのが一番楽なのかも知れませんね。

banana_c
質問者

お礼

use encoding 'shift-jis'; で実行できました。 >use encoding qw(Shift_JIS);じゃなくて >use encoding qw(shiftjis);じゃないですかね? ヒントになりました、ありがとうございます。 ご指摘のようにDBIを利用しているので、 文字コードをEUCで統一(HTML、CGI、Mysql)する テストもしてみたいと思います。 単純にファイルの保存形式を変えただけでは上手く行かない予感もしますが・・・。

回答No.2

たとえば単に下記のようなスクリプトだと, #=========================================# # 文字化け例 (スクリプトは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系を使われているのでしたらぜひ試してみてください。

参考URL:
http://www.rwds.net/kuroita/program/Perl_unicode.html
banana_c
質問者

お礼

use encoding 'shift-jis'; と記述することで所望の結果を得られました。 説明が分かりやすく大変助かりました、ありがとうございます。 ▼テスト結果 ********************************************************** ■ソース $str = "ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚" print $str."\n"; ■結果 ャtトボール大会の会場使用瑞ソ書に主催者情報の赴L漏れ発覚 ********************************************************** ********************************************************** ■ソース use encoding 'shift-jis'; $str = "ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚" print $str."\n"; ■結果 ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚 **********************************************************

banana_c
質問者

補足

ご回答ありがとうございます。 早速試してみたのですが、 use encoding qw(Shift_JIS); の一行を追加しただけで Premature end of script headers: エラーが出ます。 use encoding; としてみたところ、 Unknown encoding のエラーが出たので、これを使用するには どこかから encoding モジュール(?)を持ってこなければいけないでしょうか?それともこのレンタルサーバでは使用できないのでしょうか?

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.1

一番大事なPerlのバージョンと種類が不明 ・5.8系列ならencode系のモジュールを使う ・5.6系列ならあきらめる ・それ以外ならjperlを使う ・jcode.plの使用を考える ・ソースコードと吐き出すもののコードを変えてみる

banana_c
質問者

お礼

利用するサーバが流動的なので、こういった情報は助かります。 また、5.8系列ならencode系のモジュールを使うということで、イロイロ調べて予備知識を得られたことは大きかったと思います。 ありがとうございました。

banana_c
質問者

補足

申し訳ありません、抜けておりました。 Perlのバージョンは 5.8.0 です。

関連するQ&A

  • perlのDBIモジュールからmysqlへデータを送ったら文字化けします。

    こんにちは。 タイトル通り、perlのDBIモジュールからデータベース(mysql)にデータを渡してみたのですが(INSERT INTOです。)phpmyadminというDB管理ツールでテーブルの内容を見てみると、文字化けしてました。 フォームより受け取った値(文字列です。もっというと名前)をCGIでデータベースへ追加するといったことをしています。ソースは以下のとうりです。 require 'cgi-lib.pl'; my %formin; &ReadParse(\%formin); $sei=$formin{'sei'}; $mei=$formin{'mei'}; あとはこの変数をDBIでデータベースに渡すだけなので略します。 データベースへデータを渡したとき、文字化けさせないためには、どうしたらいいのでしょうか? 初歩的なことかもしれませんが、どうかお力を貸してください。お願いします。

    • ベストアンサー
    • MySQL
  • perlで文字化けを起こしているか否かを調べたい

    perlで文字化けを起こしているか否かを調べたい 毎回読み込んできる、文字列は、必ず、UTF-8なのですが、インターネット経由で情報を得ているため時々文字化けしていることがあります。 文字化けをしている場合、再度読み込みを行ったり、その文章を表示しないようにしたいのですが、文字化けしているか否かを知る方法はありますか? ご存知の方、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • ソース中の文字列と、DBから取得した文字列を同時に表示すると文字化け

    perl 5.8.6を使用しています。 MySQLから取り出したデータを、ソース中の文字列と同じprint文の中で 表示させようとした場合に文字化けしてしまいます。 文字コードはMySQL, ソースファイルともUnicode(UTF-8)を使用しています。 具体的には $a[0] にデータベースから取り出した文字列が入っているとすると、 ソース中で print "テスト:$a[0]"; とか print <<END_OF_TEXT; テスト:$a[0] END_OF_HTML とすると、$a[0]の部分が文字化けしてしまうのですが、 print "テスト:"; print "$a[0]"; と書くと、文字化けせずに表示されます。 ちょっと日本語を使ったり、データベースから取り出した文字列を使う箇所が多いプログラムなので、ひとつひとつprint文を分けるのは大変なので避けたいです。 何か文字化けしない回避策や、原因について考えられることがありましたら教えていただけると大変助かります。

    • ベストアンサー
    • Perl
  • Perl初心者です。文字化けについて

    プログラムの知識がほとんどないので、質問に足りないところがありましたら申し訳ありません。 Perlで書かれた、XMLを読み込むツールがあります。 XML上では文字化けしていないのに、ツールで読み込むと文字化けしてエラーになってしまいます。 Inputファイル(XML)とOutputファイル(エラーログ)の文字データを比較すると、文字化けしている文字の1バイト目がなくなっていることがわかります。 このような場合の対処方法がありましたら、教えてください。 私がツールの中身を理解できておらず、何か必要な情報などがありましたら、ご指摘ください。 宜しくお願いします。

  • MySQLの文字化けについて質問

    こんにちわ。 PerlからMySQLを呼び出す時 または、データを登録する時に、 どうしても文字化けを起こしてしまいます。 これって簡単に、回避できないでしょうか?

    • ベストアンサー
    • MySQL
  • 文字化けされたまま格納される?

    質問があるのですがよろしくお願いします。 現在、CGIを使ったサイトを持っていおり、そのサイトのデータベースをテキスト形式のものからMySQLに移行したのですが、テキスト形式でデータを保存していた時は大丈夫だったのに、MySQLに保存するようにすると、「表示」のような文字が文字化けしてブラウザに表示されるようになってしまいました。PHPMyAdminで確認すると、文字化けしているところはしているので、データをMySQLに格納する過程で文字化けしているような気がします。 これにはどういった原因が考えられるでしょうか?どなたか解決方法が分かる方ご教授よろしくお願いします。 なお、perlからDBIを経由して、MySQLにアクセスしています。

    • ベストアンサー
    • MySQL
  • 文字化け対処法

    JAVAサーブレットをやってます。 フォームに入力したデータをファイルへ保存するとき。 全角文字が含まれると文字化けが起こってしまいます。 HTMLの表示の時も文字が化けたり化けなかったりすることがあるのですが・・・。 どうすれば文字化けを防ぐ事ができますか?

    • ベストアンサー
    • Java
  • CGI(Perl)の文字化けについて

    WEBフォームからの入力データをHTMLに加工して表示するというシンプルなCGIプログラムなのですが、 全角スペースの後に全角カタカナが入ると、全角スペースの部分から後が文字化けしてしまいます。 他はきちんと表示されているのですが、全角スペースとカタカナが続いているのが良くないみたいで、文字化けしてしまうようです。 全角スペースを取ってしまえばいいのかと思い、WEBで検索して色々と試してみましたが、変わりません。。 このような場合はどういう対処をするのが一番いいのでしょうか。 文字コードはEUCを使っています。(WEBフォーム、CGIとも) 教えてください。よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • 文字化けに関して

    文字化けが起きてしまって困っています。 PHPとMysqlを使用した、CMSを今あるサーバから別のサーバに移したいのですが、 新しいサーバに移すと文字化けをしてしまいます。 正確にはデータベースから読み込んでいる部分だけが文字化けしています。 index.phpにHTMLコードとして記述してある部分は文字化けしていません。 ブラウザ(IE)の「表示→エンコード」からUTF8を選ぶと逆に データベースの部分が正確に表示され、HTMLに直接書き込んだ部分が文字化けします。 現状でわかる範囲で書きます。 ・index.phpのmetaは <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> ・MYSQL(phpmyadminに書かれている)文字セットは UTF-8 Unicode (utf8) ・php.iniの設定 mbstring.language・・・japanese mbstring.internal_encoding・・・UTF-8 mbstring.encoding_translation・・・on mbstring.http_input・・・未設定 mbstring.http_output・・・未設定 default_charset・・・未設定 output_handler・・・未設定 output_buffering・・・未設定 magic_quotes_gpc・・・Off 詳しい方よろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字化けを直すには

    現在、文字列で名前を検索してデータファイルを 開いてその名前のデータを表示するというのを作っているのですが、 名前が文字化けしてしまい困っています。 名前はスカラー変数に入ってて、    print "<tr><td>$name</td></tr>"; こんな感じで表示しているんですけど、 $nameに特定の文字がはいっていると    特性の文字・td></tr> このように文字化けみたいなことがおきてしまいます。 どうすれば回避できるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう