我通过 WYSIWYG 编辑器 ( https://summernote.org/ ) 输入了一个字符串。我遇到的问题是,当有人从 Google Docs 之类的地方粘贴文本时,它使用撇号如下:
child’s
然后我将其存储在数据库中(字符集:utf8mb4 排序规则:utf8mb4_unicode_ci)
显示数据时,它在 Mac 上的 safari 上显示为带有问号符号,但在 PC 上的 chrome 上显示正常。
我还发送了一封包含该文本的电子邮件,当它击中那个撇号时,它会完全中断电子邮件。
我尝试了以下解决方案,但似乎没有一个对我有帮助:
$str = mb_convert_encoding($str, 'UTF-8','utf8mb4');
$str = str_replace("’","'",$str);
$str = strtr($str,array("’" => "'"));
回声 mb_detect_encoding($str); // 产生 UTF-8
我理想的方法是将字符转换为“常规”撇号,然后再将其存储在数据库中。
我见过类似的问题,并测试了我见过的所有答案(包括那些没有被选为接受的答案,但没有一个有效的答案)
通过 AWS 简单电子邮件服务使用 PHPMailer
看来以下作品可用于替换撇号
function convert_smart_quotes($string)
{
$search = [
"\xC2\xAB", // « (U+00AB) in UTF-8
"\xC2\xBB", // » (U+00BB) in UTF-8
"\xE2\x80\x98", // ‘ (U+2018) in UTF-8
"\xE2\x80\x99", // ’ (U+2019) in UTF-8
"\xE2\x80\x9A", // ‚ (U+201A) in UTF-8
"\xE2\x80\x9B", // ‛ (U+201B) in UTF-8
"\xE2\x80\x9C", // “ (U+201C) in UTF-8
"\xE2\x80\x9D", // ” (U+201D) in UTF-8
"\xE2\x80\x9E", // „ (U+201E) in UTF-8
"\xE2\x80\x9F", // ‟ (U+201F) in UTF-8
"\xE2\x80\xB9", // ‹ (U+2039) in UTF-8
"\xE2\x80\xBA", // › (U+203A) in UTF-8
"\xE2\x80\x93", // – (U+2013) in UTF-8
"\xE2\x80\x94", // — (U+2014) in UTF-8
"\xE2\x80\xA6" // … (U+2026) in UTF-8
];
$replacements = [
"<<",
">>",
"'",
"'",
"'",
"'",
'"',
'"',
'"',
'"',
"<",
">",
"-",
"-",
"..."
];
return str_replace($search, $replacements, $string);
}