README.UNICODEの要約
PHP6からネイティブUnicodeサポートが始まるわけですが、実のところ、どういうものなのかよく分からなかったりします;-)
で、ソースに付属するREADME.UNICODE(リビジョン1.8)を要約してみました。
間違いがあれば指摘をお願いします。
- 内部はUTF-16
- ICUを利用する
- 文字リテラル、HTTPリクエスト、PHP識別子は全てUnicode
- unicode.semantics = On/OffでUnicodeサポートを切り替える
- Offの場合、文字リテラルはバイナリ扱い
- fallback encodingを指定しない場合、UTF-8となる
- unicode.runtime_encodingでバイナリ文字列変換のエンコーディングを指定
- キャスト
- 出力エンコーディングはunicode.output_encodingで指定
- バイナリ文字列は変換しない
- 現状のdefault_charsetは推奨されなくなる予定
- 入力エンコーディングについては現在開発中
- ファイルシステムエンコーディングはunicode.filename_encodingで指定
- スクリプトエンコーディングはunicode.script_encodingで指定
- プラグマを使ってini設定を上書き可能(ファイルの先頭で指定)
<?php declare(encoding = 'Shift-JIS');
-
- includeしたファイルには影響しない事に注意
- unicode.semanticsがOnの場合、iniファイルはutf-8として扱われる
- Offの場合はPHP5と同様「as-is」
- ストリームI/O
<?php // UTF-8で読み込み $fp = fopen('file.txt', 'rt'); $str = fread($fp, 100) // UTF-8で書き込み $fp = fopen('file.txt', 'wt'); $fwrite($fp, $uni)
-
- stream_default_encoding関数でエンコーディングを指定可能
<?php stream_default_encoding('Shift-JIS'); $data = file_get_contents('file.txt', FILE_TEXT); // work on $data file_put_contents('file.txt', $data, FILE_TEXT);
-
-
- file_get_contentsでFILE_TEXTを指定した場合はUnicode文字列が返される
- file_get_contentsでFILE_TEXTを指定しない場合はバイナリ文字列が返される
- これでも良い
-
<?php $ctx = stream_context_create(NULL, array('encoding' => 'big5')); $data = file_get_contents('file.txt', FILE_TEXT, $ctx); // work on $data file_put_contents('file.txt', $data, FILE_TEXT, $ctx);
- Unicode変換に失敗した場合、warningが発生する
- unicode_set_error_handler関数でエラーハンドラを作成し、挙動を変えることが可能
- Unicode文字列型とバイナリ文字列型
<?php $var = b'abc\001'; $var = b"abc\001"; $var = b<<<EOD abc\001 EOD;
- 配列をぐるぐる回すのではなく、TextIteratorを使う
<?php // \u308はウムラウト // 6文字 $text = "nai\u308ve"; foreach (new TextIterator($text) as $u) { var_inspect($u) } // 5文字 $text = "nai\u308ve"; foreach (new TextIterator($text, TextIterator::CHARACTER) as $u) { var_inspect($u) }