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プラグマを有効にすると次の効果があります:
高ビットのセットのあるソーステキストにあるバイトは、 リテラルのUTF8キャラクタの部分として扱われます。 このことは、ほとんどのリテラル、識別子の名前、 文字列定数、不変の正規表現のパターンも含みます。
EBCDICプラットフォームでは、Latin 1 キャラクタセットのキャラクタは、 リテラルの UTF-EBCDICのキャラクタとして扱われます。
スクリプト内に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 すべきではありません。
文字列の内部表現を、Perlの内部的なUTF-Xの形式に(適切に)変換します。
UTF-Xとして、文字列を表現するのに必要な8ビットの数を返します。
UTF-8フラグがオンであることを確認するのに使えます。
ですので、\wか、lc()は、0x80-0xFF(ASCIIとその派生)
のキャラクタを含む文字列で期待されるように動きます。
次のことに注意してください。レガシーのバイトエンコーディングを、
Unicode にする変換に使うべきではありません:
そのためには、Encode を使って下さい。encoding プラグマに影響を受けます。
文字列の内部表現を、エンコードされていないバイト列に(適切に)変換します。 成功すると真を返します。失敗すると、死ぬか、FAIL_OKが真であれば、 偽を返します。たとえば、substr() か length()関数が、 通常はより速いバイトアルゴリズムで動くようにしたい場合、 UTF-8フラグがオフであるのを確認するのに使えます。 次のことに注意してください。Unicode をレガシーのバイトエンコーディングに 戻す変換に使うべきではありません: そのためには、Encode を使って下さい。 encodingプラグマによって影響を受けません。
論理キャラクタを、8ビットシーケンス表現に、PerlのUTF-Xエンコーディングに、 (適切に)変換します。何も返しません。 Encode::encode_utf8()と同じです。 次のことに注意してください。レガシーのバイトエンコーディングを、 Unicode にする変換に使うべきではありません:そのためには、Encode を使って下さい。
$stringを、PerlのUTF-Xエンコーディングから論理キャラクタに、 適切に、変換しようとします。何も返しません。 Encode::decode_utf8()と同じです。 次のことに注意してください。Unicode をレガシーのバイトエンコーディングに 戻す変換に使うべきではありません: そのためには、Encode を使って下さい。
(Perl 5.8.1から) STRINGが、UTF-8かどうかをテストします。 機能的には、Encode::is_utf8() と同じです。
[内部変数] STRING が UTF-8 として一貫しているかを調べます。 STRING が well-formed UTF-8 で UTF-8 フラグが on の場合 または 文字列がバイトとして保持されている場合に真を返します (両方とも状態は「一貫して」います)。 このルーチンの主目的は、Perl のテストスイートが ある操作が文字列を一貫した状態に保っているかを調べられるように することです。 おそらくたいていの場合は代わりに utf8::is_utf8() を使いたいはずです。
utf8::encode は、utf8::upgrade に似ています、
ですが、UTF8 フラグが削除されます。
UTF8フラグの詳細は、perlunicode を見て下さい。
そして、C API 関数 sv_utf8_upgrade、sv_utf8_downgrade、
sv_utf8_encode、sv_utf8_decodeは、
Perl関数の、utf8::upgrade、utf8::downgrade、utf8::encode、
utf8::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 対応が重要となります。 そして残念ながら移植性のある答えが存在しません。
perluniintro, encoding, perlrun, bytes, perlunicode