|
|
Perlで日本語を扱う場合、知っておかないとエラーになってしまうことがいくつかあります。 そういったことのうちいくつかを取り上げます。
1.文字コード 代表的な文字コードには「EUC」「Shift JIS」「JIS」「Unicode」などがありますが、一般にPerlで使われるのは、EUCやShift JISです。 EUCはUNIXで使われるので、Perlでは文字コードに関連したエラーは出にくいです。 しかしWindowsではShift JISが使われ、付属のメモ帳ではShift JISしか扱えません。 こうなると、Shift JISでスクリプトを書くことが多いため、さまざまなエラーが出てしまうのです。
よくあるエラーは、文字化けです。 そのまま動くことが多いためエラーに気づかないことがあります。 CGI設置して確認… と思ったら何じゃこりゃ! 「侮ヲ」って何? というときがよくあります。 実は、「表示」が文字化けしてしまったものです。 SHIFT-JISで書かれたPerlスクリプトをUNIXで実行したときにおこります。 「表」の文字に問題があり、文字コードは「95 5C」で、「5C」が文字化けの原因です。 修正の仕方 ・後にエスケープ記号「\」を付ける。 例 : print "表\示"; ・ダブルクオーテーションマーク「"」を使用せずに、シングルクオーテーションマーク「'」を使用する。 例 : print '表示'; ・スクリプトの文字コードをEUCにする。
2.シングルクォート、ダブルクォートの使い方 日本語を含む文字列をprintで出力する場合、シングルクォート(' ')、ダブルクォート(" ")で囲むのは当たり前のことです。 が、気をつける点があります。
i.シングルクォートの中でシングルクォート文字を使用する場合、または、ダブルクォートの中でダブルクォート文字を使う場合
すなわちこういうことです。 print 'これは'メールマガジン'です'; # 「これは'メールマガジン'です」と表示するつもり print "これは"メールマガジン"です"; # 「これは"メールマガジン"です」と表示するつもり
上の2つは誤りです。
頭から見るとわかりますが、いずれも「これは」と「です」が囲まれていて、「メールマガジン」が囲まれていないことになります。
こういう場合は囲まれている中のシングル・ダブルクォートの前に\をつければいいです。 (例) print 'これは\'メールマガジン\'です'; print "これは\"メールマガジン\"です"; また、シングルクォートを含む文字列をダブルクォートで囲む、ダブルクォートを含む文字列をシングルクォートで囲むこともできます。 (例) print "これは'メールマガジン'です"; print 'これは"メールマガジン"です';
上記の作業を簡単にする方法もあります。 print qq|これは"メールマガジン"です|; qq||は" "と同じです。 print q|これは'メールマガジン'です|; q||は' 'と同じです。 もし、文中で|を使う場合は{}や[]などで囲ってもかまいません。 ii.各種変数を使う場合 たとえばこんなスクリプトではどうなるでしょうか。 -------------------------------------------------------------------------------- #!/usr/bin/perl
$site = "簡単CGI"; print "私のウェブサイトは$siteです"."\n"; print '私のウェブサイトは$siteです'."\n"; --------------------------------------------------------------------------------
<実行結果> 私のウェブサイトは簡単CGIです 私のウェブサイトは$siteです
ダブルクォートで囲った変数は展開されますが、シングルクォートで囲った変数は展開されません。 スカラー変数だけではなく、配列変数、ハッシュ変数でも同様です。
よくエラーが起こるのは、メールアドレスを変数に代入したときです。 下の2つの例をご覧ください。 -------------------------------------------------------------------------------- #!/usr/bin/perl
$mail1 = "xxx@yyy.com"; print $mail1; -------------------------------------------------------------------------------- この例ではエラーになってしまいます。 この例ではダブルクォートが使われているため、@yyyという配列変数を変数展開しようするが、ないためエラーとなります。
-------------------------------------------------------------------------------- #!/usr/bin/perl
$mail2 = 'xxx@yyy.com'; print $mail2; -------------------------------------------------------------------------------- この例ではエラーになりません。 この例ではシングルクォートなので展開されないためエラーにならず、メールアドレスが表示されます。
猫の手 高室(たかむろ)
|
■コメント
>代表的な文字コードには「EUC」「Shift JIS」「JIS」「Unicode」などがありますが、一般にPerlで使われるのは、EUCやShift JISです。
ここ数年。Perl5.8以降がリリースされてから(2002年です)現在、5.12系まで出ていますが その頃から主流はUTF8になっております。
UTF8フラグを利用するしないに限らず、UTF8が主流ですね。 JavaScriptは特にUTF8じゃないと文字列を処理できなかったりするので、Ajaxなどを行うには特に必須です。
> EUCはUNIX で使われるので、Perlでは文字コードに関連したエラーは出にくいです。
商用Unixは最近触ってないですが、Linuxのメジャーなディストリビューションは殆どがデフォルトでUTF8になってます。
|
名前: これもちょっと ¦ 14:05, Tuesday, Jul 20, 2010 ×
■コメントを書く
|
|