1

cp1251 文字セットで作成された古いサイトがたくさんあります。ユーザー入力用の非 cp1251 シンボルのサポートを実装することで、その機能を強化するように依頼されました。すべてを utf-8 に変換するには少し遅すぎます。古い文字セットに依存している文書化されていない古いものがたくさんあるためです。そのため、すべての「非標準」シンボルを HTML エンティティに変換するというアイデアを思いつきました。このタスクのために私が書いたクラスがあります。UTF-8 を cp1251 に加えて HTML エンティティに、またはその逆に変換します。あなたはそれについてどう思いますか?これを入力に適用すると、どのような問題が発生する可能性がありますか? または何か良い方法はありますか?

class UTFire
{
    /*
    * This will exclude cp1251 symbols from encoding
    */
    static $convmap = array(
                        0x0080, 0x009f, 0, 0xffff,
                        0x00a1, 0x00a3, 0, 0xffff,
                        0x00a5, 0x00a5, 0, 0xffff,
                        0x00a8, 0x00a8, 0, 0xffff,
                        0x00aa, 0x00aa, 0, 0xffff,
                        0x00af, 0x00af, 0, 0xffff,
                        0x00b2, 0x00b4, 0, 0xffff,
                        0x00b8, 0x00ba, 0, 0xffff,
                        0x00bc, 0x0400, 0, 0xffff,
                        0x040d, 0x040d, 0, 0xffff,
                        0x0450, 0x0450, 0, 0xffff,
                        0x045d, 0x045d, 0, 0xffff,
                        0x0460, 0x048f, 0, 0xffff,
                        0x0492, 0x2012, 0, 0xffff,
                        0x2015, 0x2017, 0, 0xffff,
                        0x201b, 0x201b, 0, 0xffff,
                        0x201f, 0x201f, 0, 0xffff,
                        0x2023, 0x2025, 0, 0xffff,
                        0x2027, 0x202f, 0, 0xffff,
                        0x2031, 0x2038, 0, 0xffff,
                        0x203b, 0x20ab, 0, 0xffff,
                        0x20ad, 0x2115, 0, 0xffff,
                        0x2117, 0x2121, 0, 0xffff,
                        0x2123, 0xffff, 0, 0xffff,
                       );
    // Detect if input contains UTF-8 chars
    static function isUTF8($str) {
            return preg_match('//u', $str);
    }

    // Forward conversion
    static function fwd($str) {
            if(static::isUTF8($str)) {
                   $str = mb_encode_numericentity($str, static::$convmap, 'UTF-8');
                   $str = iconv('UTF-8', 'windows-1251//IGNORE', $str);
            }
            return $str;
    }

    // Backward conversion
    static function bck($str) {
            if(!static::isUTF8($str)) {
                   $str = iconv('windows-1251', 'UTF-8//IGNORE', $str);
                   $str = mb_decode_numericentity($str, static::$convmap, 'UTF-8');
            }
            return $str;
    }
}
4

0 に答える 0