UTF-8 символы и сайт cp1251
Существует множество старых сайтов, созданных с помощью набора символов 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;
}
}