NAME

utf8 - ソースコード内に、UTF-8(か、UTF-EBCDIC)を有効/無効にするためのプラグマ

SYNOPSIS

    use utf8;
    no utf8;

    # Convert a Perl scalar to/from UTF-8.
    $num_octets = utf8::upgrade($string);
    $success    = utf8::downgrade($string[, FAIL_OK]);

    # Change the native bytes of a Perl scalar to/from UTF-8 bytes.
    utf8::encode($string);
    utf8::decode($string);

    $flag = utf8::is_utf8(STRING); # since Perl 5.8.1
    $flag = utf8::valid(STRING);

DESCRIPTION

use utf8 プラグマは、Perl パーサーに、現在のレキシカルスコープ内の プログラムのテキストに、UTF-8(EBCDIC ベースのプラットフォームなら、UTF-EBCDIC) を許すように伝えます。 no utf8 プラグマは Perl に、現在のレキシカルスコープのソーステキストを リテラルなバイトとして扱うように伝えます。

スクリプトが UTF-8 で書かれているということを Perl に教える目的以外で このプラグマをつかってはいけません。 下に書かれているユーティリティ関数は、use utf8; なしで 直接使えます。

ネイティブな 8 ビットエンコーディングから UTF-8 であると確実に 知らせることは不可能なので、perl に知らせるためにソースコードの先頭に バイト順マークを置くか、use utf8; を指定するかのどちらかが必要です。

UTF-8 が標準ソースフォーマットとなったときには、 このプラグマは事実上何もしなくなります。 利便性のために、以下での UTF-X という単語は、 ASCII と ISO Latin ベースのプラットフォームでは UTF-8 を示し、 EBCDIC ベースのプラットフォームでは UTF-EBCDIC を示すものとします。

perlrun にある、-C スイッチ及びそのいとこの $ENV{PERL_UNICODE} の 効果も参照してください。

utf8 プラグマを有効にすると次の効果があります:

スクリプト内に 8 ビットのバイト列がある(たとえば、文字列リテラルに Latin-1 がある)なら、use utf8 は不幸をもたらすでしょう; バイト列は、ほとんどの場合、適切な UTF-X ではないからです。 use utf8 内でそのようなバイト列を使いたい場合は、ブロック(または、 最上部に書けば、ファイル)の終わりまで、no utf8; で、utf8 を 無効にできます。

ユーティリティ関数

下記の関数は、Perl core によって、utf8:: パッケージに定義されています。 これらの関数を使うのに、use utf8 する必要はありませんし、 実際、本当に UTF-8 のソースコードを書こうとするのでないなら、 use utf8 すべきではありません。

utf8::encode は、utf8::upgrade に似ていますが、UTF8 フラグが 削除されます。 UTF8 フラグの詳細および、Perl 関数の utf8::upgrade, utf8::downgrade, utf8::encode, utf8::decode でラッピングされている C API 関数 sv_utf8_upgrade, sv_utf8_downgrade, sv_utf8_encode, sv_utf8_decode については perlunicode を 参照してください。 また、utf8::is_utf8, utf8::valid, utf8::encode, utf8::decode, utf8::upgrade, utf8::downgrade は、 実際には内部関数なので、常に require utf8 なしで利用可能になっています。

BUGS

識別子の名前として Unicode を使えますが、パッケージ/クラスや サブルーチンの名前としては使えません。 Perl 5.8.0 からはこれに関する限定された機能が存在しますが、 これらは予定されたものというよりは偶然の産物です; このような目的で Unicode を使うことは非サポートです。

この不完全性の原因の一つは(現在のところ)先天的な非移植性です; パッケージ名とサブルーチン名はそれぞれファイルとディレクトリ名に 対応付けられる必要があるので、ファイルシステムの Unicode 対応が 重要となります -- そして残念ながら移植性のある答えが存在しません。

SEE ALSO

perlunitut, perluniintro, perlrun, bytes, perlunicode