PHP5.3.6でUTF-8の文字列をmb_check_encoding()でチェックを行うと、互換性のため5バイト以上の形式でも正しいエンコーディングとしてTRUEを返してしまいます。


現在はmb_check_encoding()のあと、チェックしたいUTF-8の文字列をUTF-16に変換し、再度UTF-8に再変換しチェックを行ってますが、あまりよいやり方とは思えません。

そこで上記以外の、より高速なチェック方法がありましたら教えて下さい。
ソース付きで回答して頂けると喜びます。よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/06/14 15:25:50
  • 終了:2011/06/21 13:07:44

回答(1件)

id:JiroSuzuki No.1

ジロー回答回数6ベストアンサー獲得回数02011/06/20 23:53:11

各自で対処と言うことでいいと思います

id:xxmasaxx

申し訳ありませんが、回答になっておりません。

2011/06/21 13:06:41
  • id:dothan
    質問の主旨が分からないのですが、UTF-8は6バイト長まで定義されているわけですが、7バイト長以上で明らかにUTF-8ではない文字列なのにTRUEを返してしまうということでしょうか?
    つまり、mb_check_encodingの動作不良を前提としたご質問でしょうか?
    その場合、与えた文字列を16進表記でお知らせいただけませんでしょうか。
  • id:practicalscheme
    UTF-8は当初は0x7fffffffまでの整数を最高6オクテットまで使うように定義されましたが[1]、Unicodeのコードポイントが0x10ffffまでに制限されたことにより、現在は最高4オクテットになってますよ[2]。

    [1] http://tools.ietf.org/html/rfc2279
    [2] http://tools.ietf.org/html/rfc3629

  • id:xxmasaxx
    説明が足りなくて失礼しました。

    UTF-8は過去に6バイトまで定義されてますが、practicalschemeさんが仰るように現在は4バイトまでになっており、4バイトまでの形式をチェックしたいのですが、mb_check_encoding()は過去の互換性を考慮して6バイトまでの形式でもTRUEを返してしまう、ということです。
  • id:JULY
    PHP-dev でこの RFC3629 に関する話をしているスレッドがありました。

    http://ml.php.gr.jp/pipermail/php-dev/2009-April/001462.html

    このメールをスタートとするスレッドなのですが、

    http://ml.php.gr.jp/pipermail/php-dev/2009-April/001469.html

    で、

    --------------------------------------------------------------
    1. ISO/IEC 10646 の UTF-8 は obsolete なのか
    2. ISO/IEC 10646 に倣って reserved となっている区点に対応する
    シーケンスも許容するのかどうか
    3. 許容しないとして、理論上 5 バイトや 6 バイト長となるシー
    ケンスが来た場合にどのような対処をすればいいのか
    --------------------------------------------------------------

    という論点になり、どうもはっきりとした結論に至らなかったような感じです。

    Unicode としては 4 バイトまでなんだけど、ISO/IEC 10464 との関係はどうよ、といった感じみたいで、積極的に「UTF-8 は4バイトまで」と変更した気配は無いです。

    http://ml.php.gr.jp/pipermail/php-dev/2009-April/001475.html

    このメールで、互換モードの on/off みたいなのはどう?、という提案が出ているのですが、そうしよう、といった話の流れにはならなかったようです。
  • id:xxmasaxx
    遅くなりましたが、コメント有り難うございます。
    本家のほうでも、認識はしているものの具体的な対策はなく、今のところ各自で対処、ということですね。
    参考になりました。

この質問への反応(ブックマークコメント)

トラックバック

  • http://q.hatena.ne.jp/JiroSuzuki/ 登録していきなりサブアカウント使ってるってか? 自動終了間近の質問狙い撃ちじゃないか   http://q.hatena.ne.jp/1308031035#a1079997 他の質問サイトに誘導しているだ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません