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
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することで
スクリプトが期待通り動かなくなる可能性があります。
ですので、モジュールを活用しているのであれば
使用を避けるのが賢明だと思います。
この回答への補足
>>Premature end of script headers: エラーが出ます。
>このエラーはPerlスクリプトの記述によるエラーでは多分ありません。
通常は
use encoding qw(Shift_JIS);
とすることで利用できるはずで、この一行を付加しただけでPremature end of script headers:エラーが出るということはレンタルサーバの運用者に問い合わせた方がよい ということでしょうか?
あれからイロイロ調べて
#!/usr/bin/perl --
と--をくっつけてみたりしたのですが、どうやってもエラーがなくなりません。
No.5
- 回答日時:
とりあえず、試験用の簡単なスクリプトを作ってみて、
それが正常動作するか、あるいはPremature ...
のエラーになるか確認してみてください。
use encoding の引数で与えられた引数のチェックは
かなりゆるくできているので、Shift_JIS でも
大丈夫だとは思いますが、念のため
#4でg_p_さんの書かれている通り、
別の、shiftjis とか sjis というパターンで試してみても
いいかもしれません。
use encoding 'shift-jis';
と記述することで所望の結果を得られました。
>use encoding の引数で与えられた引数のチェックは
>かなりゆるくできているので、Shift_JIS でも
>大丈夫だとは思いますが、念のため・・・
この部分で、もしかしたら唯一無二の書式ではないのかも知れないと思い、イロイロ試してみた結果上記のパターンで上手く行きました。
文字コードをEUCで統一(HTML、CGI、Mysql)した場合、読み込んでいるcssやFlashなどの外部ファイルの扱いなどはどうなるのかなど多くの検証が必要ですが、近いうちに試してみたいと思います。ありがとうございました。
No.4
- 回答日時:
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)する
テストもしてみたいと思います。
単純にファイルの保存形式を変えただけでは上手く行かない予感もしますが・・・。
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 …
この回答への補足
ご回答ありがとうございます。
早速試してみたのですが、
use encoding qw(Shift_JIS); の一行を追加しただけで
Premature end of script headers: エラーが出ます。
use encoding; としてみたところ、
Unknown encoding のエラーが出たので、これを使用するには
どこかから encoding モジュール(?)を持ってこなければいけないでしょうか?それともこのレンタルサーバでは使用できないのでしょうか?
use encoding 'shift-jis';
と記述することで所望の結果を得られました。
説明が分かりやすく大変助かりました、ありがとうございます。
▼テスト結果
**********************************************************
■ソース
$str = "ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚"
print $str."\n";
■結果
ャtトボール大会の会場使用瑞ソ書に主催者情報の赴L漏れ発覚
**********************************************************
**********************************************************
■ソース
use encoding 'shift-jis';
$str = "ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚"
print $str."\n";
■結果
ソフトボール大会の会場使用申請書に主催者情報の表記漏れ発覚
**********************************************************
No.1
- 回答日時:
一番大事なPerlのバージョンと種類が不明
・5.8系列ならencode系のモジュールを使う
・5.6系列ならあきらめる
・それ以外ならjperlを使う
・jcode.plの使用を考える
・ソースコードと吐き出すもののコードを変えてみる
利用するサーバが流動的なので、こういった情報は助かります。
また、5.8系列ならencode系のモジュールを使うということで、イロイロ調べて予備知識を得られたことは大きかったと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- 政治 私の発明した「二階建て漢字」は使えるでしょうか? 3 2023/02/08 16:40
- Java Java 南京錠 2 2023/02/04 11:46
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Excel(エクセル) countif関数について質問 4 2022/06/14 12:11
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Visual Basic(VBA) Activesheet.Pasteで困っています 1 2023/01/22 07:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
$com::VDの意味がわかりません
-
Excel VBA 『Call』で呼び出す...
-
Excel VBA 定義されたプロージ...
-
「デバイスは PRN を初期化でき...
-
VBA This Workbookモジュール...
-
Excel VBAでリンク切れをチェッ...
-
VBAでoutlook365が起動しません。
-
Excel VBAで、ユーザーフォーム...
-
VBAで別モジュールへの変数の受...
-
COBOLで、Shellを起動するには?
-
エクセルVBAでシートモジュール...
-
perlをバージョンアップしたら...
-
例外処理のフローチャートの記...
-
VBでグローバル変数を宣言するには
-
現在アクティブなフォーム名を...
-
初心者です・・ppmを入力すると...
-
モジュールとクラスの違いって...
-
【vba】フォームに書いてあ...
-
Cからシェルを起動し返り値をハ...
-
LCD ディスプレイを Raspberry ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
bashのgrepで複数の検索、かつ...
-
エラー
-
Pod::Usageで日本語を使用する...
-
perlでactive directoryに登録
-
perlスクリプト s/^\\s+//; ...
-
perl+shiftjisで5c文字化けの対...
-
実行時パラメータを使用するとE...
-
UTF-8で書かれたHTMLファイルを...
-
XML::XPathで日本語検索するには
-
メールフォームからの受信メー...
-
何時間後を求める。
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
おすすめ情報