Windows-1251 и UTF-8 символы

Статус
Закрыто для дальнейших ответов.

CamaroSS

Well-Known Member
Регистрация
21.02.2012
Сообщения
176
Есть необходимость добавить поддержку всяких разных символов из юникода для вводимых данных на нескольких старых самописных сайтах, которые изначально работают в windows-1251, но в некоторых участках имеют вкрапления utf-8 и windows-1252 :wacko: . Так как перекодировка всего и вся в utf-8 займёт значительное время плюс может какие-то моменты попросту поломать, было решено сделать поддержку по типу ВК, то есть всё приводится к windows-1251, а "редкие" символы преобразуются в HTML-сущности.
Пока сделал такой класс для преобразования данных туда-обратно, вроде бы работает, как ожидается, и довольно шустро. Как вам такой подход, какие могут быть неприятности?
Код:
class UTFire
{
    /*
    * Русские буквы не должны преобразовываться в HTML-сущности
    */
    static $convmap = array(0x80,0x40f,0,0xffff,0x450,0xffff,0,0xffff);
    static function isUTF8($str) {
	    return preg_match('//u', $str);
    }
    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;
    }
    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;
    }
}
 

lekzd

parse error: parse error, unexpected T_STRING...
Регистрация
17.02.2011
Сообщения
1 125
Знаки переноса могут биться еще, могут добавляться новые строки, проблемы будут возникать по мере тестинга "живьем" =)
 

CamaroSS

Well-Known Member
Регистрация
21.02.2012
Сообщения
176
Так по convmap-то мы вроде первые 127 символов и не трогаем. Или это может сделать iconv? Пока я вижу одну проблему - это отловить все заботливо расставленные превращалки & в & .
 

CamaroSS

Well-Known Member
Регистрация
21.02.2012
Сообщения
176
Вот ещё полный конвмап для cp1251
Код:
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,
						   );
 
Статус
Закрыто для дальнейших ответов.
Верх Низ