php: преобразование из cp1251 в utf8

У меня проблема с преобразованием строки из cp1251 в utf8...

Мне нужно получить некоторые имена из базы данных, и эти имена находятся в cp1251 (я не тот, кто сделал эту базу данных, поэтому я не могу ее редактировать, но я точно знаю, что это имена cp1251)...

Имя в БД такое - "Р?нтернет РІ циС"рах" Я конвертирую его в utf8 с помощью функции iconv вот так:

iconv("UTF-8", "CP1251//ИГНОР", $имя)

и что у меня в результате это - "�?нтернет в цифрах"(это русский язык), но первые два символа не верны... должно быть "Интернет в цифрах"...

Итак, последнее, что мне нужно сделать, это каким-то образом изменить эти два символа «�?» на русскую букву "И"... и я действительно не знаю, как это сделать... Я пытался использовать preg_replace, но это не работает... или я не правильно его использую.

И простите за русские буквы, очень сложно объяснить, что мне нужно, не показывая их.


person Pigalev Pavel    schedule 22.11.2012    source источник
comment
Чтобы преобразовать cp1251 в utf8, вы должны использовать iconv("CP1251//IGNORE", "UTF-8", $name) (см. руководство по php).   -  person Alain Tiemblo    schedule 22.11.2012
comment
Проблема также может заключаться в использовании неправильной сортировки соединения, поэтому соединение с самой базой данных уничтожает данные. Вы правильно видите строку в phpMyAdmin?   -  person Alex    schedule 22.11.2012
comment
Нинсуо, я знаю это! Но это работает только так... И это ОЧЕНЬ странно   -  person Pigalev Pavel    schedule 22.11.2012
comment
Какую базу данных вы используете? MySQL?   -  person Joni    schedule 25.11.2012


Ответы (3)


Первая буква получается неправильной, потому что один из байтов, необходимых для хранения кодировки UTF-8 для И (точнее, 0x98), не используется в CP1251. Если база данных заменила байт 98 знаком вопроса, вы должны изменить его обратно перед использованием iconv:

$name = str_replace("\xD0\x3F", "\xD0\x98", $name);
echo iconv("UTF-8", "CP1251//IGNORE", $name);
person Joni    schedule 24.11.2012

использовать это:

mb_convert_encoding($model->text, 'cp1252', 'utf8')
person Denis Alexandrov    schedule 24.02.2015

Попробуй это:

function cp1251_to_utf8($s){
           $c209 = chr(209); $c208 = chr(208); $c129 = chr(129);
           for($i=0; $i<strlen($s); $i++)    {
               $c=ord($s[$i]);
               if ($c>=192 and $c<=239) $t.=$c208.chr($c-48);
               elseif ($c>239) $t.=$c209.chr($c-112);
               elseif ($c==184) $t.=$c209.$c209;
               elseif ($c==168)    $t.=$c208.$c129;
               else $t.=$s[$i];
           }
           return $t;
       }
person Ing. Michal Hudak    schedule 22.11.2012
comment
он вернул в��Р�Р�Р�В�Р�в�... - person Pigalev Pavel; 22.11.2012