Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

README.UNICODEの要約

PHP6からネイティブUnicodeサポートが始まるわけですが、実のところ、どういうものなのかよく分からなかったりします;-)
で、ソースに付属するREADME.UNICODE(リビジョン1.8)を要約してみました。

間違いがあれば指摘をお願いします。

<?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)
<?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文字列型とバイナリ文字列型
    • バイナリ文字列型は後方互換性、非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)
}
  • POSIXロケールではなくICUロケールになるので、setlocale関数を使わないこと
    • 代わりに、locale_set_default関数、locale_get_default関数を使用する