4

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

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

数据库中的名称是这样的 - “Р?РЅС,ернеС, РІ цифраС...”我使用这样的 iconv 函数将其转换为 utf8:

iconv("UTF-8", "CP1251//忽略", $name)

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

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

对于俄罗斯的信件,我很抱歉,如果不展示它们,真的很难解释我需要什么。

4

3 回答 3

3

第一个字母不正确,因为CP12510x98中没有使用存储 И(准确地说)的 UTF-8 编码所需的一个字节。如果数据库已用问号替换了字节,则必须在使用之前将其更改回:98iconv

$name = str_replace("\xD0\x3F", "\xD0\x98", $name);
echo iconv("UTF-8", "CP1251//IGNORE", $name);
于 2012-11-24T23:04:21.247 回答
2

用这个:

mb_convert_encoding($model->text, 'cp1252', 'utf8')
于 2015-02-24T13:20:28.307 回答
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;
       }
于 2012-11-22T08:25:27.677 回答