0

テキストをUTF8としてDBに保存しています。

投稿が JS 経由で API に送信されると、ö などの記号が「ö」として返されます。

私のウェブサイトのhtmlは次のように宣言されています

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

私の API 出力は、次のように utf-8 を宣言するヘッダーとともに送信されます。

$status_header = 'HTTP/1.1 '.$status.' '.self::getStatusCodeMessage($status);
header($status_header);
header('Content-type: ' . $content_type.'; charset=utf-8');

if ($body !== '') {
    echo $body;

これを回避する唯一の方法は、出力で PHP を使用してこれを行うことです。

private static function fixText($text) {

        $replaceChars = array(
            "“" => "\"",
            '•' => '·',
            "â€" => "\"",
            "’" => "'",
            'ö' => 'ö',

            'â€' => "'",

            "é" => "é",
            "ë" => "ë",
            "£" => "£"
        );
        foreach($replaceChars as $oldChar => $newChar) {
            $text = str_replace($oldChar, $newChar, $text);
        }

        $text = iconv("UTF-8", "UTF-8//IGNORE", $text);
        return $text;
    }

マップにシンボルをどんどん追加しなければならないので、明らかにこれは理想的ではありません。


アップデート:

ある開発者がこっそりと次のコードを追加しました。

$document->text = mb_convert_encoding($document->text, mb_detect_encoding($document->text), "cp1252");

破損した古いラテン文字を克服する方法として。

4

1 に答える 1

1

これらの変な文字が表示されるということは、二重にエンコードされた UTF-8 が保存されていることを意味します。データベースにデータを追加する方法を示していません。utf8_encode()既に UTF-8 でエンコードされた文字列で使用すると、これが結果になります。

MongoDB は UTF-8 のみを受け入れますが、既に Web サーバーによって UTF-8 が送信されている場合は、再度エンコードしないでください。

それ以外の:

header('Content-type: ' . $content_type.'; charset=utf-8');

でデフォルトの文字セットを設定することを検討してくださいphp.ini

default_charset=UTF-8
于 2013-08-06T13:51:10.587 に答える