アプリ版:「スタンプのみでお礼する」機能のリリースについて

ActivePerl5.8の日本語処理で困っています。
EUCで書かれたのHTMLファイルに、タグの修正などの文字列処理をしているのですが、
*その結果をshift-jisで出力したい。
*コマンドライン上の文字も文字化けさせずに表示したい
というあたりで困っています。

use encoding 'shiftjis';
binmode STDERR, ':encoding(shiftjis)';

という記述を書けばOKという記述を見たため試したのですが、うまく動きません。記述を外して、ソースをeucで書くと、コマンドライン表示以外はうまく動くのですが、他の組み合わせですと、日本語の文字処理がうまく行かかかったり、perl自体が落ちたりと、試行錯誤の連続です。

文字処理というのは例えば、以下のような感じです。
print $mytitle;
if ($mytitle =~/(【.*?】)/){
$subtitle = "<div class=\"head2\">$1<\/div>\n";
}
(【】で囲んだ文字だけに特定のスタイルを効かせる。)

文字列処理とコマンドラインも文字化けの双方を解決させる手立てを教えて頂ければと思います。

よろしくお願いします。

A 回答 (3件)

ソースはUTF-8で書きましょう。


記述の仕方はこんな感じ。
------------------------------
use utf8;
use strict;
binmode STDOUT, ":encoding(cp932)"; #標準出力をcp932に
binmode STDERR, ":encoding(cp932)"; #標準エラー出力をcp932に

open (IN, "<:encoding(euc-jp)", "eucjp.txt"); #EUC-JPで書かれたファイルを読み込む
#以下略
-------------------------------

細かいことについては以下のページを読むと良いです。

Perl 5.8.x Unicode関連
http://www.rwds.net/kuroita/program/Perl_unicode …
Perl の概要と実行法
http://homepage2.nifty.com/ttoyoshima/Perl/Intro …
WindowsでPerlを使うもんじゃない
http://www.aritia.org/hizumi/perl/perlwin.html

この回答への補足

さっそくの回答ありがとうございます。
やってみました(休日に自宅でやるしか余裕がないもので、返事も遅れてしまいました)。

実行すると、コマンドラインが文字列を吐き出して、そのまま閉じてしまいます。エラーした風な動作に見えます。(ただし実行しているように見えます)
上記 use strictの行を#use strictにして実行すると
下記コメントが出力されました。いったん、<STDIN>で止めているのですが、エンターを押すと、やはり消えます。

Mailformed UTF-8 character (unexpected continuaion byte 0xa1,with no preceeding start byte) at [perl実行ファイル名] line66.
Mailformed UTF-8 character (unexpected non-continuaion byte 0x2e,with no preceeding start byte) at [perl実行ファイル名] line66.
Mailformed UTF-8 character (unexpected continuaion byte 0xa1,with no preceeding start byte) at [perl実行ファイル名] line66.
Mailformed UTF-8 character (unexpected non-continuaion byte 0x29,with no preceeding start byte) at [perl実行ファイル名] line66.

66行目は
if ($mytitle =~/(【.*?】)/){
と書かれています。ここが、日本語文字を使う唯一の個所です。

繰り返しですが、エラーメッセージの文字は以下の4つ
0xa1
0x2e
0xa1
0x29
0x2eは「.」0x29は「)」まではわかったのですが…。

何が問題なのでしょうか。よろしくお願いします。

補足日時:2009/02/11 10:13
    • good
    • 0

> 何が問題なのでしょうか。


use utf8;はソースコードがUTF-8で書かれていることを宣言するものなので、
ソースコードは「UTF-8」で書いてください。


ここからは余談ですが、
エラーメッセージなどはわざわざタイプするのではなく、
コピー&貼り付けしましょう。
そうすればスペルミス・タイプミスの心配が無くなります。
何より楽です。

Malformed UTF-8 character (unexpected continuation byte 0xa1, with no preceding start byte) at a.pl line 4.
Malformed UTF-8 character (unexpected non-continuation byte 0x2e, immediately after start byte 0xda) at a.pl line 4.
Malformed UTF-8 character (unexpected continuation byte 0xa1, with no preceding start byte) at a.pl line 4.
Malformed UTF-8 character (unexpected non-continuation byte 0x29, immediately after start byte 0xdb) at a.pl line 4.


あと気になるのが、
> 実行すると、コマンドラインが文字列を吐き出して、そのまま閉じてしまいます。
そのまま閉じるって、もしかしてダブルクリックで実行したりしてませんか?
コマンドプロンプトから
perl [perl実行ファイル名]
の様に実行していれば閉じたりはしないと思うのですが。


> 上記 use strictの行を#use strictにして実行すると
use strint;は厳密な文法チェックを行うためのプログマで
例えば宣言していない変数をいきなり参照するとエラーにしてくれたりします。
私は数行のテストコードでもなければたいていつけますが、
ゆるい文法のperlを使いたいなら外してください。

Perl/CGIに必ず登場するuse strictの解説(初心者向け) - DQN起業日記
http://dqn.sakusakutto.jp/2008/06/perlcgiuse-str …
冒頭で必ず宣言するプラグマ strict と warnings - Perl入門~サンプルコードによるPerl入門~
http://d.hatena.ne.jp/perlcodesample/20080107/12 …

この回答への補足

ありがとうございます。いろいろ勉強になりました。
ただ、Activeperlを使った場合に、閉じない方法はないものでしょうか。最終的に「素人」に操作させたいので、ダブルクリックでスタート、コマンドラインに簡単なメッセージを出して作業を確認といった流れにしたいのです。もともとのスクリプトでは、<STDIN>を入れておけば、止まってくれるので、同じように動作ができないものかと思っている次第です。

補足日時:2009/02/15 20:05
    • good
    • 0

> <STDIN>を入れておけば、止まってくれるので、同じように動作ができないものかと思っている次第です。


最終的にはそれでよいかもしれませんが
開発中はエラーメッセージを見るためにコマンドラインから実行するべきではないですか?



スクリプト中に本来の処理と無関係な <STDIN> を入れたくないなら、

perl test.pl
pause

と書いたバッチファイルを作ってこれを実行してもらうとか。
これならエラーメッセージも見られると思いますし。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!