我在将字符串从cp1251转换为utf8时遇到问题...
我需要从数据库中获取一些名称,这些名称在cp1251中(我不是那个创建该数据库的人,所以我无法编辑它,但我确定这些名称是cp1251)..
数据库中的名字是这个 - “Р?РЅС,РμСЂРЅРμС,вциєраС......“ 我正在使用iconv函数将它转换为utf8:
iconv(“UTF-8”,“CP1251 // IGNORE”,$ name)
我在结果中得到的是 - “ ?нтернетвцифрах”(这是俄语),但前两个符号不正确......应该是“Интернетвцифрах”......
所以我要做的最后一件事是以某种方式改变这两个符号“ ?”俄语字母“И”...我真的不知道该怎么做...我试过使用preg_replace,但它不起作用......或者我没有正确使用它。 / p>
我很抱歉俄罗斯的信件,很难在不显示的情况下解释我的需求。
答案 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;
}