日本語処理の注意
2015年12月31日 (木) 13:39時点におけるimported>Webmasterによる版
Perlによる文字操作
コンピュータでは日本語を表す(記録する)ためには、様々な規格(文字コード)が存在します。システムによってはキャラクターセット等とも言いますが、一例では以下のような規格があります。
- ISO-8859-1
- ISO-2022-JP
- Shift_JIS
- EUC-JP
- UTF-8
- UTF-16
日本語などのマルチバイト文字(文字を複数のバイトで表示する)をPerlで適切に扱うに、どのような文字コードををどのような文字コードで処理して、何処のような文字コードで出力するか。を適切に行わないと「文字化け」になります
処理イメージ
例えば、UTF-8のファイルをパソコンで処理します。パソコンの内部はUTF-8で処理を行い、ファイル出力はSJIS、画面出力はCP932(Windowsの標準出力)。と言うように、どのようなファイルをどのように処理するか正しく考えなければなりません。
簡単なプログラム説明
動作を説明するために簡単なPerl処理と出力について説明する。
サンプルプログラム
use strict;
use warnings;
use utf8;#utf8フラグを立てる
use Encode;
my $string = 'アイウエオ';
print utf8::is_utf8($string) ? 'flagged' : 'no flag';
print "\n";
print encode('shiftjis', $string);#UTF-8フラグを外してshiftjisで出力
print "\n";
print encode('cp932', $string);#UTF-8フラグを外してcp932で出力
print "\n";
print encode('utf8', $string);#UTF-8フラグを外してUTF-8で出力
print "\n";
print $string;#そのまま標準出力
print "\n";
例1
プログラムはShift-JISで保存
結果
no flag←utf8フラグ判定は無し ?A?C?E?G?I←UTF-8フラグを外してshiftjisで出力 ?A?C?E?G?I←UTF-8フラグを外してcp932で出力 ツアツイツウツエツオ←UTF-8フラグを外してUTF-8で出力 アイウエオ←そのまま標準出力
当たり前ですが、そもそもShift-JISで保存している文字はShift-JISですのでそのまま、標準出力される文字が正しく表示されます
例2
プログラムはUTF-8で保存
結果
no flag ??¢????????¨??? a?¢a??a?|a?¨a?a テ」ツつ「テ」ツつ、テ」ツつヲテ」ツつィテ」ツつェ 繧「繧、繧ヲ繧ィ繧ェ
これも、