php:从cp1251转换为utf8

时间:2012-11-22 08:20:19

标签: php utf-8 preg-replace iconv cp1251

我在将字符串从cp1251转换为utf8时遇到问题...

我需要从数据库中获取一些名称,这些名称在cp1251中(我不是那个创建该数据库的人,所以我无法编辑它,但我确定这些名称是cp1251)..

数据库中的名字是这个 - “Р?РЅС,РμСЂРЅРμС,вциєраС......“ 我正在使用iconv函数将它转换为utf8:

  

iconv(“UTF-8”,“CP1251 // IGNORE”,$ name)

我在结果中得到的是 - “ ?нтернетвцифрах”(这是俄语),但前两个符号不正确......应该是“Интернетвцифрах”......

所以我要做的最后一件事是以某种方式改变这两个符号“ ?”俄语字母“И”...我真的不知道该怎么做...我试过使用preg_replace,但它不起作用......或者我没有正确使用它。 / p>

我很抱歉俄罗斯的信件,很难在不显示的情况下解释我的需求。

3 个答案:

答案 0 :(得分:3)

第一个字母出错是因为CP1251中没有使用存储И(0x98的UTF-8编码所需的字节之一)。{{3}}。如果数据库已用问号替换98字节,则必须在使用iconv之前将其更改为:

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

答案 1 :(得分:2)

使用它:

mb_convert_encoding($model->text, 'cp1252', 'utf8')

答案 2 :(得分:0)

试试这个:

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;
       }