• 追加された行はこの色です。
  • 削除された行はこの色です。
* 日本語処理の基本 [#e0fa4606]
* 文字コード操作の前提知識 [#ff454b64]

- 日本語処理(マルチバイト対応substr()など)は、UTF8フラグ付きUTF8文字列に対して行う。
- (標準出力やファイルに)出力する文字列はUTF8フラグ付きであってはならない。UTF8フラグを落とす必要がある。
- UTF8フラグを付けるにはEncodeモジュールのdecode()を、UTF8フラグを落とすにはencode()を使う。
- 一般的に、プログラムの最初に引数やファイルから受け取った文字列に対してdecode()してUTF8フラグを付け、その日本語文字列に必要な処理をした後、プログラムの最後にencode()してUTF8フラグを落し、画面やファイルに出力する。
- use utf8(もしくはuse encoding 'euc-jp')を宣言すれば、そのスクリプトに書かれた文字列は(decode()しなくとも)自動的にUTF8フラグ付きとして扱われる。従って、出力する際は必ずencode()しなければならない。
- 注意すべきなのは、「UTF8フラグのないUTF8文字列」と「UTF8フラグ付きUTF8文字列」は別のものということ。
** 文字列には2種類の状態がある [#n4174680]
- 内部文字列(UTF8フラグ付き)
- バイト列(UTF8フラグなし)

*** 注意するのは [#h538e4c2]
UTF8フラグと文字コードは無関係な事。例えば「UTF8フラグ付きなSJISの文字列」「UTFフラグなしなUTF8の文字列」というのはあり得る。「バイト列」「内部文字列」という用語を使った方が分かりやすい。

** 内部文字列とバイト列の違い [#yb8a09df]
*** 内部文字列 [#h2cda358]
 $str = 'あいうえお';    # $str が内部文字列の状態であると仮定すると、
 say length($str);       # length()は$strを5文字と解釈する。
*** バイト列 [#vd303eb7]
 $bytes = 'あいうえお';  # $bytes がバイト列の状態であると仮定すると、
 say length($bytes);     # length()は$strを10文字と解釈する。

** 内部文字列とバイト列の使い分け [#a6b5dc3f]
- 通常、Perlスクリプト内では、文字列は内部文字列の状態で扱う。
- しかし、文字列をファイルや標準出力に書き込む場合は、バイト列の状態でなければならない。
- また、文字列をファイルや標準入力から読み込む場合、バイト列の状態でやってくる。
- この為、必要に合わせて、内部文字列とバイト列の状態を変換する。

** 内部文字列とバイト列の状態を変換する方法 [#u0c11628]
*** バイト列から内部文字列へ [#qd7246ec]
 my $str = Encode::decode('utf8', $bytes);
*** 内部文字列からバイト列へ [#va6a3cea]
 my $bytes = Encode::encode('utf8', $str);
*** 内部文字列・バイト列の変換をする際に文字コードの変換も一緒に出来る [#pe32f853]
例えば、
 my $str = decode('sjis',$bytes);
でUTF8フラグなしなSJISの文字コードの文字列をUTF8フラグ付きなUTF8の文字列する。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS