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