我将文本作为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");
作为一种克服旧拉丁角色遭遇破坏的方法。
答案 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