UTF8 TEXT以奇怪的符号回归

时间:2013-08-06 10:18:14

标签: php mongodb utf-8

我将文本作为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");

作为一种克服旧拉丁角色遭遇破坏的方法。

1 个答案:

答案 0 :(得分:1)

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

MongoDB只接受UTF-8,但如果您已经通过网络服务器向您发送UTF-8,则不应再自己编码。

而不是:

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

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

default_charset=UTF-8