UTF8文本带着奇怪的符号返回


UTF8 TEXT coming back with weird symbols

Im将文本作为UTF8存储在数据库中。

当一篇文章通过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");

作为一种克服旧拉丁字符损坏的方法。

看到这些有趣的字符意味着存储了双重编码的UTF-8。您没有显示如何将数据添加到数据库中。如果您对已经UTF-8编码的字符串使用utf8_encode(),这将是您的结果。

MongoDB只接受UTF-8,但如果您已经通过Web服务器获得了UTF-8,则不应该再自己对其进行编码。

代替:

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

考虑在php.ini:中设置默认字符集

default_charset=UTF-8