* 文字コード操作の前提知識 [#ff454b64]

** 文字列には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の文字列する。
でUTF8フラグなしなSJISの文字コードの文字列をUTF8フラグ付きなUTF8の文字列する。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS