4

文字列をcp1251からutf8に変換する際に問題が発生しました...

データベースからいくつかの名前を取得する必要があり、それらの名前はcp1251にあります(私はそのデータベースを作成した人ではないため、編集できませんが、これらの名前はcp1251であることは確かです)...

データベース内の名前は次のとおりです-"Р?РЅС、ернеС、вцифрах"次のようなiconv関数を使用してutf8に変換しています。

iconv( "UTF-8"、 "CP1251 // IGNORE"、$ name)

結果にあるのはこれです-「�?нтернетвцифрах」(ロシア語です)が、最初の2つの記号は正しくありません...「Интернетвцифрах」である必要があります...

だから私がしなければならない最後のことは、どういうわけかこれらの2つの記号「�?」を変更することです。ロシア語の文字「И」に...そしてそれを行う方法が本当にわかりません...preg_replaceを使用しようとしましたが、機能しません...または正しく使用していません。

そして、ロシア語の手紙をお詫びします。私が必要なものを見せずに説明するのは本当に難しいです。

4

3 に答える 3

3

CP1251 では0x98И (正確には)の UTF-8 エンコーディングを格納するために必要なバイトの 1 つが使用されていないため、最初の文字は正しくありません。データベースがバイトを疑問符に置き換えた場合は、使用する前に元に戻す必要があります:98iconv

$name = str_replace("\xD0\x3F", "\xD0\x98", $name);
echo iconv("UTF-8", "CP1251//IGNORE", $name);
于 2012-11-24T23:04:21.247 に答える
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 に答える