• 追加された行はこの色です。
  • 削除された行はこの色です。
* Encode.pmを使った文字コード変換 [#n2533631]
* 文字コードの操作 - Encode [#s553221d]

** 日本語処理の流れ [#q08a182a]
例えば、EUCの文字列を受け取り、加工し、SJISへの変換する場合、
** UTF8フラグなし → UTF8フラグ付き [#ee1a06fc]
 my $str = Encode::decode('sjis',$bytes); # $bytesの文字コードはSJISと仮定する

 [EUC文字列]→ [UTF8フラグ付きUTF8文字列]→[加工されたUTF8フラグ付きUTF8文字列]→[SJIS文字列]

のような流れになる。
** UTF8フラグ付き → (文字コード変換)→ UTF8フラグなし [#t1f756ba]
 my $bytes = Encode::encode('euc-jp',$str); # $bytesの文字コードはEUC-JPに変換される

** 基本 [#tc71b44d]
** UTF8フラグなし → (文字コード変換)→ UTF8フラグなし [#n728d09a]
 Encode::from_to($bytes,'sjis','euc-jp'); # $bytesの文字コードはSJISからEUC-JPへ破壊的に変換される

- 日本語処理(マルチバイト対応substr()など)は、UTF8フラグ付きUTF8文字列に対して行う。
- (標準出力やファイルに)出力する文字列はUTF8フラグ付きであってはならない。UTF8フラグを落とす必要がある。
- 「UTF8フラグのないUTF8文字列」と「UTF8フラグ付きUTF8文字列」は別のもの。
** どの文字コードか調べる [#acea58bc]
 my $enc = Encode::Guess::guess_encoding($text,qw/euc-jp sjis/);  # $textはUTFフラグ付きでもなしでもよい
                                                                  # utf-8はデフォルトなので指定は不要
 print $enc->name,"\n";                                           # "euc-jp"などと表示される

** 日本語処理をするためのプラグマ、モジュール [#k4d74978]
:use encoding 'ENCODE'|特定の文字コード(含むUTF8)で書かれたPerlスクリプトで日本語処理をする。
:use utf8|UTF8で書かれたPerlスクリプトで日本語処理をする。
:Encode::decode('FROM_ENCODE',$no_utf8_flag_text)|UTF8フラグなしの文字列を、その文字の文字コードを指定して、UTF8フラグを付ける。
:Encode::encode('TO_ENCODE',$utf8_flag_text)|UTF8フラグ付きの文字列を指定した文字コードに変換する(UTF8フラグを落す)
:Encdoe::from_to($no_utf8_flag_text,'FROM_ENCODE','TO_ENCODE')|UTF8フラグのない文字列の文字コードの変換する。
:use openもしくは3つの引数を取るopen()|日本語で書かれたファイルを読み書きする。
** UTF8フラグ付き →(文字コード変換)→ UTF8フラグ付き [#e80a2937]
 $text = Jcode->new($text,'utf-8')->euc; # UTF8からEUC-JPへの変換される
                                         # $textはUTFフラグ付きでもなしでもよい

** 使いどころ [#scbb4cab]
:Perlスクリプト内で日本語を直に書いて($text='あああ')処理を行う場合|use encodingもしくはuse utf8
:日本語処理が必要な個所があった場合|Encodeモジュール
:日本語ファイルを読み書きする時|use openもしくは3つの引数を取るopen()
** 参考(perldoc) [#ee284602]
- [[Encode>http://search.cpan.org/perldoc?Encode]]
- [[Encode::Guess>http://search.cpan.org/perldoc?Encode::Guess]]
- [[Jcode>http://search.cpan.org/perldoc?Jcode]]
- http://perl-users.jp/articles/advent-calendar/2009/casual/10.html

*** 注意点 [#sde2f691]
機能的にはEncodeモジュールがあれば、use encodingやuse utf8は不要。ただし、Perlスクリプト内で日本語を直に書く量が多い場合、use encodingやutf8してスクリプト内全体にUTF8フラグを付けた方が楽。

** 関連 [#ub0714c4]
- [[use encoding>Perl/use encoding]]
- [[use utf8>Perl/use utf8]]
- [[Perl/日本語処理/ファイルの入出力]]


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