http://blog.xole.net/article.php?id=625 で紹介していただいたphp_iovm 0.3.0ですが、10/16のエントリの影響をモロに受けるので、PHP 5.3/6.0ではコンパイルできません。来月中にはこの点の修正と、名前空間をサポートした0.4.0を出す予定です。
あとIoSeqからzvalへの変換が常にバイナリ文字列でUnicode文字列にはしない理由はこの2点です。
- Sequenceはバイナリデータも格納できる。
- Sequence encoding で得られるエンコーディングが信頼できない。(Sequence toUTF* はエンコーディングの変換を伴うが、Sequence setEncoding は属性を変更するだけで変換までは行わない)
ただ、UTF-8として妥当なバイト列であるかを検証する関数は用意されているので、UTF-8ならUnicode文字列へ変換するのはありかもしれません。やっぱりUnicode文字列への変換を試みて、失敗したらバイナリ文字列を返すようにします。(unicode.semantics=On のとき)
if (UG(unicode) && UArray_isLegalUTF8((UArray *)IoObject_dataPointer(seq))) {
zval_string_to_unicode_ex(str, UG(utf8_conv) TSRMLS_CC);
}