[pod] [xml]

名前

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

概要

    use utf8;
    no utf8;
    $num_octets = utf8::upgrade($string);
    $success    = utf8::downgrade($string[, FAIL_OK]);
    utf8::encode($string);
    utf8::decode($string);
    $flag = utf8::is_utf8(STRING); # since Perl 5.8.1
    $flag = utf8::valid(STRING);

説明

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

このプラグマは、そもそも、互換性のための工夫です。 Perl 5.6未満のバージョンでは、ソースコード中の恣意的なバイト列を許していました。 ですが、将来、ソーステキストに、UTF-8 エンコーディングを標準化したいと思っています。

Perl に script が UTF-8 で書かれているということを教える目的以外で このプラグマをつかってはいけません。 下に書かれている、utf8のユーティリティ関数は、それ自身の目的で有益です。 しかしそれらは、"プラグマ的な"効果の部分ではまったくありません。

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

-Cスイッチとそのいとこの、$ENV{PERL_UNICODE}を、perlrunで見て下さい。

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

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

自動的に、8bitレガシーのバイト列をUTF-8にアップグレードしたいなら、 /encoding プラグマを、このプラグマの代わりに使ってください。 たとえば、例で使われているように、ISO 8859-1 (Latin-1) のバイト列を UTF-8に暗にアップグレードしたいなら、chr()\x{...}を使います。 次のようにします:

    use encoding "latin-1";
    my $c = chr(0xc4);
    my $x = "\x{c5}";

迷っている場合:こうしてください。 use encoding 'utf8';は、use utf8;と、大差ありません。

ユーティリティ関数

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

utf8::encode は、utf8::upgrade に似ています、 ですが、UTF8 フラグが削除されます。 UTF8フラグの詳細は、perlunicode を見て下さい。 そして、C API 関数 sv_utf8_upgradesv_utf8_downgradesv_utf8_encodesv_utf8_decodeは、 Perl関数の、utf8::upgradeutf8::downgradeutf8::encodeutf8::decode でラッピングされています。 Perl 5.8.0 と、5.8.1 の実装で、utf8::is_utf8、utf8::valid、 utf8::encode、utf8::decode、utf8::upgrade、utf8::downgradeは、 常にrequire utf8なしで利用可能になっています。 -- これは、将来のリリースで変わるかもしれません。

バグ

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

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

SEE ALSO

perluniintro, encoding, perlrun, bytes, perlunicode