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件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
ソースは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は「)」まではわかったのですが…。
何が問題なのでしょうか。よろしくお願いします。
No.2
- 回答日時:
> 何が問題なのでしょうか。
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>を入れておけば、止まってくれるので、同じように動作ができないものかと思っている次第です。
No.3
- 回答日時:
> <STDIN>を入れておけば、止まってくれるので、同じように動作ができないものかと思っている次第です。
最終的にはそれでよいかもしれませんが
開発中はエラーメッセージを見るためにコマンドラインから実行するべきではないですか?
スクリプト中に本来の処理と無関係な <STDIN> を入れたくないなら、
perl test.pl
pause
と書いたバッチファイルを作ってこれを実行してもらうとか。
これならエラーメッセージも見られると思いますし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- HTML・CSS CSSファイルの日本語コメントが文字化けしてしまう 3 2022/12/26 15:50
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- その他(パソコン・周辺機器) WINDOWS11 IMEの日本語入力で困っています 4 2023/04/29 19:24
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlで 引数1を別リストの複数...
-
system関数を使用してJava実行...
-
Excel VBAでリンク切れをチェッ...
-
教えて下さい。
-
ユーザー定義関数に#NAME?が返...
-
グラフのX,Y座標を取得したい
-
Excel VBA 『Call』で呼び出す...
-
ArduinoのジャイロモジュールMP...
-
例外処理のフローチャートの記...
-
モジュールとは何ですか
-
Excelで時刻になったら知らせて...
-
LCD ディスプレイを Raspberry ...
-
VBA This Workbookモジュール...
-
エクセルVBAでシートモジュール...
-
EXECEL VBA コマンドボタンか...
-
VBでグローバル変数を宣言するには
-
Excel VBA 標準モジュール内で...
-
VBAで別モジュールへの変数の受...
-
VBAのモジュールについて教えて...
-
VBA モジュールを閉じるショー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlソースコードをコンパイル...
-
プロシージャの戻り値を取得す...
-
Perlで環境変数を設定するには
-
systemの引数の中括弧
-
system関数を使用してJava実行...
-
perlでコマンドプロンプト実行
-
Perlのexitについて
-
PERLからcshellを実行したいの...
-
Perlスクリプトが実行できない...
-
pp (Perl Packager) で require...
-
Cygwin上でperlスクリプトの実行
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
おすすめ情報