「日本語処理の注意」の版間の差分
ナビゲーションに移動
検索に移動
imported>Webmaster (ページの作成:「---- <!-- カテゴリに追加するページ名を記入 --> にほんごしょりのちゅうい」) |
imported>Webmaster |
||
(同じ利用者による、間の11版が非表示) | |||
1行目: | 1行目: | ||
+ | == Perlによる文字操作 == | ||
+ | コンピュータでは日本語を表す(記録する)ためには、様々な規格(文字コード)が存在します。システムによってはキャラクターセット等とも言いますが、一例では以下のような規格があります。 | ||
+ | *ISO-8859-1 | ||
+ | *ISO-2022-JP | ||
+ | *Shift_JIS | ||
+ | *EUC-JP | ||
+ | *UTF-8 | ||
+ | *UTF-16 | ||
+ | 日本語などのマルチバイト文字(文字を複数のバイトで表示する)をPerlで適切に扱うに、どのような文字コードををどのような文字コードで処理して、何処のような文字コードで出力するか。を適切に行わないと「文字化け」になります | ||
+ | == 処理イメージ == | ||
+ | [[File:2015-12-31 13-15-19.png|400px]]<br /> | ||
+ | 例えば、UTF-8のファイルをパソコンで処理します。パソコンの内部はUTF-8で処理を行い、ファイル出力はSJIS、画面出力はCP932(Windowsの標準出力)。と言うように、どのようなファイルをどのように処理するか正しく考えなければなりません。<br /> | ||
+ | == 簡単なプログラム説明 == | ||
+ | 動作を説明するために簡単なPerl処理と出力について説明する。 | ||
+ | ---- | ||
+ | サンプルプログラム | ||
+ | <syntaxhighlight lang="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"; | ||
+ | </syntaxhighlight> | ||
+ | ---- | ||
+ | === 例1 === | ||
+ | *プログラムは'''Shift-JIS'''で保存 | ||
+ | *use utf8;はコメントアウト | ||
+ | |||
+ | 結果 | ||
+ | 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'''で保存 | ||
+ | *use utf8;はコメントアウト | ||
+ | |||
+ | 結果 | ||
+ | no flag | ||
+ | ??¢????????¨??? | ||
+ | a?¢a??a?|a?¨a?a | ||
+ | テ」ツつ「テ」ツつ、テ」ツつヲテ」ツつィテ」ツつェ | ||
+ | 繧「繧、繧ヲ繧ィ繧ェ | ||
+ | |||
+ | プログラム中の<code>my $string = 'アイウエオ';</code>はUTF-8になりますので、標準出力にUTF-8で出力しますので文字化けします | ||
+ | ---- | ||
+ | === 例3 === | ||
+ | *プログラムは'''Shift-JIS'''で保存 | ||
+ | *use utf8;を有効 | ||
+ | |||
+ | 結果 | ||
+ | flagged←utf8フラグ判定は'''有効''' | ||
+ | ?A?C?E?G?I←UTF-8フラグを外してshiftjisで出力 | ||
+ | ?A?C?E?G?I←UTF-8フラグを外してcp932で出力 | ||
+ | アイウエオ←UTF-8フラグを外してUTF-8で出力 | ||
+ | Wide character in print at C:\Users\home\Desktop\g-mon\prog\日本語.pl line 20. | ||
+ | アイウエオ←UTF-8フラグが付いた文字列をprintするためエラーがでる | ||
+ | プログラム中の<code>my $string = 'アイウエオ';</code>はShift-JISになります。'''UTF-8フラグを外してUTF-8で出力'''が正しく表示されるのが分かりませんが、あまり良い出力では無いと思います。UTF-8フラグが付いた文字列をそのまま出力しようとするため<code>Wide character in print at...</code>が出ます | ||
+ | |||
+ | ---- | ||
+ | |||
+ | === 例4 === | ||
+ | *プログラムは'''UTF-8'''で保存 | ||
+ | *use utf8;を有効 | ||
+ | |||
+ | 結果 | ||
+ | flagged←utf8フラグ判定は'''有効''' | ||
+ | アイウエオ←UTF-8フラグを外してshiftjisで出力 | ||
+ | アイウエオ←UTF-8フラグを外してcp932で出力 | ||
+ | 繧「繧、繧ヲ繧ィ繧ェ←UTF-8フラグを外してUTF-8で出力 | ||
+ | Wide character in print at C:\Users\home\Desktop\g-mon\prog\日本語.pl line 20. | ||
+ | 繧「繧、繧ヲ繧ィ繧ェ←UTF-8フラグが付いた文字列をprintするためエラーがでる | ||
+ | |||
+ | これが、一番正しい処理だと思う。 | ||
---- | ---- | ||
<!-- カテゴリに追加するページ名を記入 --> | <!-- カテゴリに追加するページ名を記入 --> | ||
[[Category:Perl|にほんごしょりのちゅうい]] | [[Category:Perl|にほんごしょりのちゅうい]] |
2015年12月31日 (木) 14:01時点における最新版
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で保存
- use utf8;はコメントアウト
結果
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で保存
- use utf8;はコメントアウト
結果
no flag ??¢????????¨??? a?¢a??a?|a?¨a?a テ」ツつ「テ」ツつ、テ」ツつヲテ」ツつィテ」ツつェ 繧「繧、繧ヲ繧ィ繧ェ
プログラム中のmy $string = 'アイウエオ';
はUTF-8になりますので、標準出力にUTF-8で出力しますので文字化けします
例3
- プログラムはShift-JISで保存
- use utf8;を有効
結果
flagged←utf8フラグ判定は有効 ?A?C?E?G?I←UTF-8フラグを外してshiftjisで出力 ?A?C?E?G?I←UTF-8フラグを外してcp932で出力 アイウエオ←UTF-8フラグを外してUTF-8で出力 Wide character in print at C:\Users\home\Desktop\g-mon\prog\日本語.pl line 20. アイウエオ←UTF-8フラグが付いた文字列をprintするためエラーがでる
プログラム中のmy $string = 'アイウエオ';
はShift-JISになります。UTF-8フラグを外してUTF-8で出力が正しく表示されるのが分かりませんが、あまり良い出力では無いと思います。UTF-8フラグが付いた文字列をそのまま出力しようとするためWide character in print at...
が出ます
例4
- プログラムはUTF-8で保存
- use utf8;を有効
結果
flagged←utf8フラグ判定は有効 アイウエオ←UTF-8フラグを外してshiftjisで出力 アイウエオ←UTF-8フラグを外してcp932で出力 繧「繧、繧ヲ繧ィ繧ェ←UTF-8フラグを外してUTF-8で出力 Wide character in print at C:\Users\home\Desktop\g-mon\prog\日本語.pl line 20. 繧「繧、繧ヲ繧ィ繧ェ←UTF-8フラグが付いた文字列をprintするためエラーがでる
これが、一番正しい処理だと思う。