PHP6の新機能 Unicodeへの対応

現在PHPでは、unicodeはネイティブにサポートされてはおらず、mbstringエクステンションを使用して対応していました。
PHP6からは、ネイティブにunicodeがサポートされるようですね。
ということで、unicodeサポートについて調べてみることに

お金に余裕があるなら、確実に本物を買いたいときは、直営店が一番手っ取り早いので、まずは下記を調査します。
README.UNICODE

じゃあ、抜粋して要約…ていうか主観的意訳ですので、正確な情報は、ご自分で読んで理解してくださいね。。
文頭が「☆」なものは、横槍や補足です。

                                                                        • -

導入

                                                                        • -

mbstringが、より簡単なマルチバイトデータ処理を可能にしましたが、PHPはネイティブにユニコードをサポートをしていません。
時代の流れには逆らえないので、ICUというライブラリを使用して、unicodeをサポートすることにしました。

                                                                        • -

全体的な注意点

                                                                        • -

この国際化機能は、主に「ICU (International Components for Unicode)」ライブラリを利用して実装されています。
ICUは、IBMが提供するUnicodeと国際化処理のためのC/C++Java向けライブラリで、オープンソースライセンスの下で配布されています。
以下のような機能があります。
エンコーディングの変換
文字列照合
Unicodeテキストの処理
その他たくさん
http://www.phppro.jp/phpmanual/php/ref.unicode.html

PHP6をビルドすると、unicodeサポートは使用できるようになっています。

    • with-icu-dir=<dir>

このように、ICUのライブラリの場所を指定してください。

ちなみに、ICUはPHP6にはまだバンドルされていないので、DLしてくる必要があります。
ICUはVer.3.4以降のものが必要。

                                                                        • -

以前のバージョンとの互換性

                                                                        • -

互換性はすごく大事なので維持しようとしていますが、特定の処理において、処理速度には何らかの影響がでるかも。。
☆詳しく後で調べたいところです。。

                                                                        • -

Unicode使用の切りかえ

                                                                        • -

unicodeサポートが必要ない場合もあるでしょうから、必要なときに設定ファイルで、下記のように設定してください。
デフォルトではOffになってます。
unicode.semantics = On/Off

そうすると、下記がunicodeになります。
すべての文字列リテラル
HTTPリクエストからの変数
PHP識別子

PHPの内部エンコーディングunicodeといなり、それ以外の文字列はシステムが変換するようになります。
unicode.semantics = Onの場合に、バイナリを扱う場合は、それを明示的に宣言してやる必要があります。
unicode.semantics = Offの場合は、今までと変わらない挙動をします。

                                                                        • -

Fallback Encoding

                                                                        • -

unicode.*_encodingを指定しなかった場合に使われます。
fallback_encodingの指定もなかった場合は、UTF-8が使用されます。
unicode.fallback_encoding = "iso-8859-1"

                                                                        • -

Runtime Encoding

                                                                        • -

PHPの内部でバイナリを変換する場合のエンコーディングを指定します。
unicode.runtime_encoding = "iso-8859-1"

                                                                        • -

Output Encoding

                                                                        • -

標準出力の場合に、使用されるエンコーディングです。
unicode.output_encoding = "utf-8"
バイナリの場合は変換しません。
default_charsetは非推奨とされ、今後はunicode.output_setting を使うようになります。
unicode.semantics がOffの場合のみ、default_charsetは有効になります。

                                                                        • -

HTTP Input Encoding

                                                                        • -

開発中です。

                                                                        • -

Filesystem Encoding

                                                                        • -

unicode.filename_encoding = "utf-8"

                                                                        • -

Script Encoding

                                                                        • -

ICUがサポートするエンコーディングが使用できます。
iniで設定する場合
 unicode.script_encoding = utf-8
プログラム内で設定する場合
 
上記はインクルードファイルには影響しません。

                                                                        • -

iniファイル

                                                                        • -

unicode.semanticsがOnの場合、iniの値はUTF-8エンコーディングされていると解釈されます。

                                                                        • -

Stream I/O

                                                                        • -

デフォルトでPHPは、バイナリモードでstreamsをオープンします。
ファイルをテキストモードでオープンするには、tフラグ (もしくは FILE_TEXTパラメータ/以下参照) が必要です。
テキストモードのストリームのデフォルトのエンコーディングUTF-8 です。

                                                                        • -

変換規則とエラー処理

                                                                        • -

バイナリとunicodeを結合しようとした場合、PHPはまずバイナリをunicodeに変換します。
しかし、unicode変換できない文字列があった場合は、下記のエラーを出力して、処理を中止します。
Warning: Could not convert binary string to Unicode string
(converter UTF-8 failed on bytes (0xE9) at offset 2)
逆のエラーの場合は、このようになります。
Warning: Could not convert Unicode string to binary string
(converter ISO-8859-1 failed on character {U+DC00} at offset 2)
unicodeを変換する際に、表現できない文字があった場合の挙動や、変換中にエラーが起こった場合の挙動を変更する方法、そのオプションなどは原文に記載がありますので、ご参照下さい。

                                                                        • -

エラーハンドラの定義

                                                                        • -

エラーハンドラを定義します。
mixed unicode_set_error_handler(callback error_handler)
ユーザーが定義したハンドラがFALSEを返却した場合は、標準のハンドラが実行されます。
☆ハンドラに指定するオプションは、原文に記載がありますので、ご参照下さい。

                                                                        • -

unicodeに完全対応しているエクステンションはこちら。

                                                                        • -

unicodeに完全対応しているエクステンションはこちら。
curl
・ dom
json
mysql
・ mysqli
・ oci8
・ pcre
・ reflection
・ simplexml
soap
sqlite
xml
・ xmlreader/xmlwriter
・ xsl
・ zlib

setlocale()は非推奨になります。
Unicode semanticsがOnの場合に、setlocale()を使用すると、警告が出力されます。