「日本語処理の注意」の版間の差分

提供: dococo wiki
ナビゲーションに移動 検索に移動
imported>Webmaster
imported>Webmaster
 
(同じ利用者による、間の5版が非表示)
53行目: 53行目:
  
 
=== 例2 ===
 
=== 例2 ===
----
+
*プログラムは'''UTF-8'''で保存
プログラムは'''UTF-8'''で保存<br />
+
*use utf8;はコメントアウト
 +
 
 
結果
 
結果
 
  no flag
 
  no flag
62行目: 63行目:
 
  繧「繧、繧ヲ繧ィ繧ェ
 
  繧「繧、繧ヲ繧ィ繧ェ
  
これも、
+
プログラム中の<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で適切に扱うに、どのような文字コードををどのような文字コードで処理して、何処のような文字コードで出力するか。を適切に行わないと「文字化け」になります

処理イメージ

2015-12-31 13-15-19.png
例えば、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するためエラーがでる

これが、一番正しい処理だと思う。