Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: iconv и спецсимволы
 
 автор: Читатель   (07.04.2011 в 02:49)   письмо автору
 
 

Доброй ночи.

Скрипт в 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?), что-то у меня не получается найти.
Яндекс отвечает: синтаксическая ошибка, а гугль ничего не находит.

  Ответить  
 
 автор: cheops   (07.04.2011 в 09:41)   письмо автору
 
   для: Читатель   (07.04.2011 в 02:49)
 

Хм... ну разве что str_replace() вместо preg_replace() использовать - будет немного быстрее (правда в этом случае не сильно).

  Ответить  
 
 автор: Читатель   (07.04.2011 в 11:06)   письмо автору
 
   для: cheops   (07.04.2011 в 09:41)
 

str_replace() вообще не работает. Изначально так и пробовала. Но проблема даже не в скорости обработки, а в том, что я не могу предусмотреть сразу все ошибки и приходится отлавливать по одной по мере их обнаружения.

  Ответить  
 
 автор: cheops   (07.04.2011 в 11:25)   письмо автору
 
   для: Читатель   (07.04.2011 в 11:06)
 

Вообще говоря странно, что ошибки вообще возникают, обычно iconv() достаточно корректно работает. Не происходит никакой дополнительной обработки текста до iconv()?

  Ответить  
 
 автор: Читатель   (07.04.2011 в 12:01)   письмо автору
 
   для: 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. Регулярное выражение по шаблону, кстати, тоже не работает.

  Ответить  
 
 автор: Читатель   (08.04.2011 в 01:25)   письмо автору
 
   для: Читатель   (07.04.2011 в 12:01)
 

Откуда "ноги растут" я нашла. Это символы из таблицы символов WORDa, скопированные методом copy-paste. Вот на некоторых из них iconv() почему-то и спотыкается. Но их там очень много. Как придумать автозамену пока в голову не приходит.

  Ответить  
 
 автор: Читатель   (08.04.2011 в 01:46)   письмо автору
 
   для: Читатель   (08.04.2011 в 01:25)
 

Попробовала вместо iconv() использовать mb_convert_encoding()
Частично помогло. Те же символы превращаются в знаки вопроса, но функция не "спотыкается". Все лучше, чем preg_replace() и постоянный отлов ошибок.

Но если кто-то знает, как решить этот вопрос по-другому, буду благодарна за ответ.

  Ответить  
 
 автор: Читатель   (08.04.2011 в 01:55)   письмо автору
 
   для: Читатель   (08.04.2011 в 01:46)
 

Рано обрадовалась. На символе &#224; (буква а с "ударением") упала и mb_convert_encoding()

  Ответить  
 
 автор: Nextia   (08.04.2011 в 04:36)   письмо автору
 
   для: Читатель   (08.04.2011 в 01:55)
 

а сам скрипт в utf-8 не удастся сохранить?

  Ответить  
 
 автор: Читатель   (08.04.2011 в 15:19)   письмо автору
 
   для: Nextia   (08.04.2011 в 04:36)
 

А что это даст? БД-то все-равно в cp1251. И данные, так или иначе, нужно конвертить в cp1251

  Ответить  
 
 автор: z668   (08.04.2011 в 05:05)   письмо автору
 
   для: Читатель   (08.04.2011 в 01:55)
 

Попробуйте вот этот класс:

http://mikolajj.republika.pl/files/ConvertCharset/ConvertCharset_v1.1.zip

  Ответить  
 
 автор: Читатель   (08.04.2011 в 15:26)   письмо автору
 
   для: z668   (08.04.2011 в 05:05)
 

Спасибо. Поищу в нем нужную функцию, попробую, отпишу.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования