|
|
|
| Доброй ночи.
Скрипт в cp1251. Данные приходят в utf-8. C помощью iconv конвертирую в cp1251, но на некоторых символах iconv спотыкается. Например, 1/2 (½).
Благо, preg_replace() работает с utf-8 и можно произвести замену до конвертации:
<?php $cont = preg_replace('|\xC2\xBD|','1/2',$cont);
|
Но у меня два вопроса. Возможно, есть выход лучше, чем preg_replace() и где взять полную таблицу подобных символов (они родные вообще для urf-8?), что-то у меня не получается найти.
Яндекс отвечает: синтаксическая ошибка, а гугль ничего не находит. | |
|
|
|
|
|
|
|
для: Читатель
(07.04.2011 в 02:49)
| | Хм... ну разве что str_replace() вместо preg_replace() использовать - будет немного быстрее (правда в этом случае не сильно). | |
|
|
|
|
|
|
|
для: cheops
(07.04.2011 в 09:41)
| | str_replace() вообще не работает. Изначально так и пробовала. Но проблема даже не в скорости обработки, а в том, что я не могу предусмотреть сразу все ошибки и приходится отлавливать по одной по мере их обнаружения. | |
|
|
|
|
|
|
|
для: Читатель
(07.04.2011 в 11:06)
| | Вообще говоря странно, что ошибки вообще возникают, обычно iconv() достаточно корректно работает. Не происходит никакой дополнительной обработки текста до iconv()? | |
|
|
|
|
|
|
|
для: cheops
(07.04.2011 в 11:25)
| | Нет, до iconv() только один заголовок: header('Content-type: text/html; charset=utf-8');
потом в переменную получаем данные и сразу iconv() - потом уже все остальное.
Если подобных символов нет, то все работает без ошибок, как только подобный символ - iconv конвертирует только до него.
Вот символы, которые мне удалось собрать, может еще кому пригодится:
$array_utf_pm = array
(
'\xEF\xBB\xBF\xD0\xA1',
'\xE2\x97\x8F',
'\xEF\x83\x98',
'\xE2\x89\x88',
'\xE2\x81\x84',
'\xE2\x80\x90',
'\xE2\x90\x8B',
'\xE2\x88\x99',
'\xE2\x80\xB3',
'\xEF\x83\xBC',
'\xEF\x80\xAD',
'\xEF\xBF\xBD',
'\xE2\x90\x81',
'\xC2\xB2',
'\xC3\x97',
'\xCC\x81',
'\xCD\x98',
'\xCD\x87',
'\xC2\xB8'
);
$cont = preg_replace('|\xC2\xBD|','1/2',$cont);
$cont = preg_replace('|\xC2\xBC|','1/4',$cont);
$cont = preg_replace('|\xC2\xBE|','3/4',$cont);
$cont = preg_replace($array_utf_pm,'',$cont);
|
Но это же не дело, по одному символу описывать, а что делать - не знаю. Может, я чего-то не понимаю?
P.S. Регулярное выражение по шаблону, кстати, тоже не работает. | |
|
|
|
|
|
|
|
для: Читатель
(07.04.2011 в 12:01)
| | Откуда "ноги растут" я нашла. Это символы из таблицы символов WORDa, скопированные методом copy-paste. Вот на некоторых из них iconv() почему-то и спотыкается. Но их там очень много. Как придумать автозамену пока в голову не приходит. | |
|
|
|
|
|
|
|
для: Читатель
(08.04.2011 в 01:25)
| | Попробовала вместо iconv() использовать mb_convert_encoding()
Частично помогло. Те же символы превращаются в знаки вопроса, но функция не "спотыкается". Все лучше, чем preg_replace() и постоянный отлов ошибок.
Но если кто-то знает, как решить этот вопрос по-другому, буду благодарна за ответ. | |
|
|
|
|
|
|
|
для: Читатель
(08.04.2011 в 01:46)
| | Рано обрадовалась. На символе à (буква а с "ударением") упала и mb_convert_encoding() | |
|
|
|
|
|
|
|
для: Читатель
(08.04.2011 в 01:55)
| | а сам скрипт в utf-8 не удастся сохранить? | |
|
|
|
|
|
|
|
для: Nextia
(08.04.2011 в 04:36)
| | А что это даст? БД-то все-равно в cp1251. И данные, так или иначе, нужно конвертить в cp1251 | |
|
|
|
|
|
|
|
|
для: z668
(08.04.2011 в 05:05)
| | Спасибо. Поищу в нем нужную функцию, попробую, отпишу. | |
|
|
|