CGI-BBS > 基礎 > その他 > 全てSJIS環境でのPerl文字化け(文字コード'5C'問題)


カレッヂ
カレッヂ


質問者 ゆーお  投稿日 2/22(木) 18:35:43
WindowsNTServer4.0上でIISを利用しイントラのWebサイトを構築しています。
サーバーもクライアントも全てWindowsという完全Shift-JIS環境で
ActivePerlを利用し動的処理を行っています。

しかしながら、Perl+SJIS環境で起こる文字コード'5C'に伴う文字化け問題で苦しんでいます。

Perl上でのHTML部分でダイレクトに記述している
「表示」や「予定」は
お決まりの「'」(シングルコーテーション)で囲んだり
「\」を後ろに付ける事で解決できるのですが、
問題は変数に入れた値を表示するときなんです。
当然変数に「'」や「\」は付けられません。
では、代入するときにはどうかというと、
実はこれがDBからの値をPerl上で直接受け取っているので
「'」や「\」を付けることができません。

ex)
@OUT = `f:/wwwroot/bin/TARGET_SEARCH.exe $output`;

このように@OUTに入ってくる実値を見ることはできないのです。
その後@OUTをsplitなどで更に個別の変数に分けていってる状態です。

要するに

@OUT = ("表示","予定");
---------------------
|         A         |
---------------------
print "Content-type: text/html\n\n";
print "<html><body>";
print "$OUT[0]<br>";
print "$OUT[1]<br>";
print "</body></html>";

これを正常表示させるには
Aにどのような処理を行えばよいのかということになります。

もしもこの問題に答えを導いていただける方がいらっしゃれば
是非ともご回答をお願い致します。
回答者 しあわせのツボ  [削除]  投稿日 2/22(木) 18:57:35
quotemetaという関数があります。
$var = quotemeta($var);
とすると、$var内のメタ文字が全てエスケープされます。
質問者 ゆーお  [削除]  投稿日 2/22(木) 23:25:27
しあわせのつぼさん、ありがとうございました。

しかしながら、この方法でもどうも上手くいきませんでした。
文字化けを起こしていた一文字分だけは、上手く表示されるのですが、
それまで正常に出ていた他の文字が化けるようになってしまいました。

前回の例で行けば
$OUT[0]=quotemeta($OUT[0]);
$OUT[1]=quotemeta($OUT[1]);
をやってみたり
できないと思っても
@OUT=quotemeta(@OUT);
を試してみたり。

何かやり忘れたことがあるのでしょうか?

やはり、解決は不可能なのでしょうか?

ちなみに、現在利用しているActivePerlから
Jperlに変更した場合にはこの文字化け問題は同様に発生するのでしょうか?

どうぞ、お願い致します。
回答者 しあわせのツボ  [削除]  投稿日 2/23(金) 00:14:51
本当に5c「だけ」が化けるのであれば、

@OUT = ("表示","予定");
print "Content-type: text/html\n\n";
print "<html><body>";
foreach $tmp(@OUT) { $tmp =~ s/\\/\\\\/g; print "$tmp<br>"; }
print "</body></html>";
でどうでしょう。
回答者 まだ名前はない  [削除]  投稿日 2009/12/29(火) 23:54:19
Sjis.pm がおすすめです
http://text.world.coocan.jp/TSNET/?Sjis.pm
回答者 Sjis.pmがおすすめ  [削除]  投稿日 2012/9/30(日) 23:47:19
#!perl
use Sjis;
@OUT = ("表示","予定");
print "Content-type: text/html\n\n";
print "<html><body>";
print "$OUT[0]<br>";
print "$OUT[1]<br>";
print "</body></html>";
__END__

を hyoji.pl として perl hyoji.pl を実行すると

#!perl
use Esjis 0.83;

@OUT = ("表\示","予\定");
print "Content-type: text/html\n\n";
print "<html><body>";
print "$OUT[0]<br>";
print "$OUT[1]<br>";
print "</body></html>";
__END__

という内容の hyoji.pl.e が作成されて実行されます。

ちなみに質問に書かれている

@OUT = ("表示","予定");←ここ

の行は最後のセミコロンが全角になっているので、そのまま
貼り付けてファイルを作るとエラーになりますよ。

返信(回答)する


Web裏技