• 追加された行はこの色です。
  • 削除された行はこの色です。
* Encode.pmを使った文字コード変換 [#n2533631]
* Encode モジュール [#f71e77d7]

** 日本語処理の流れ [#q08a182a]
例えば、EUCの文字列を受け取り、加工し、SJISへの変換する場合、

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

のような流れになる。

** 基本 [#tc71b44d]

- 日本語処理(マルチバイト対応substr()など)は、UTF8フラグ付きUTF8文字列に対して行う。
- (標準出力やファイルに)出力する文字列はUTF8フラグ付きであってはならない。UTF8フラグを落とす必要がある。
- 「UTF8フラグのないUTF8文字列」と「UTF8フラグ付きUTF8文字列」は別のもの。
- 一般的に言って、プログラムの最初にdecode()して、必要な処理をした後、プログラムの最後にencode()する。

** 日本語処理をするためのプラグマ、モジュール [#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()|日本語で書かれたファイルを読み書きする。
** 関数 [#t0076750]
*** UTF8フラグ無しの文字列にUTF8フラグを付ける。 [#ee1a06fc]
 $utf8_flag_text = Encode::decode('FROM_ENCODE',$no_utf8_flag_text)

** 使いどころ [#scbb4cab]
:Perlスクリプト内で日本語を直に書いて($text='あああ')処理を行う場合|use encodingもしくはuse utf8
:日本語処理が必要な個所があった場合|Encodeモジュール
:日本語ファイルを読み書きする時|use openもしくは3つの引数を取るopen()
*** UTF8フラグ付きの文字列を指定した文字コードに変換してUTF8フラグを落す。 [#b5dbd024]
 $no_utf8_flag_text = Encode::encode('TO_ENCODE',$utf8_flag_text)

*** 注意点 [#sde2f691]
機能的にはEncodeモジュールがあれば、use encodingやuse utf8は不要。ただし、Perlスクリプト内で日本語を直に書く量が多い場合、use encodingやutf8してスクリプト内全体にUTF8フラグを付けた方が楽。
*** UTF8フラグ無しの文字列の文字コードの変換する。 [#n89c5816]
 Encode::from_to($no_utf8_flag_text,'FROM_ENCODE','TO_ENCODE')
$no_utf8_flag_textは破壊的に変換される。

** 関連 [#ub0714c4]
- [[use encoding>Perl/use encoding]]
- [[use utf8>Perl/use utf8]]
- [[Perl/日本語処理/ファイルの入出力]]
*** どの文字コードか調べる [#acea58bc]
 $enc = Encode::Guess::guess_encoding($text,qw/euc-jp sjis/); # $textはUTFフラグ付きでも無しでもよい
                                                              # utf-8はデフォルトなので指定は不要
 print $enc->name,"\n";                                       # "euc-jp"などと表示される
*** UTF8フラグ付きの文字列の文字コードを変換する [#j9953de7]
 $text = Jcode->new($text,'utf-8')->euc;
Jcodeを使う。この場合、UTF8からEUC-JPへの変換。$textはUTFフラグ付きでも無しでもよい。

** 参考(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]]


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