向MySQL插入数据前如何将智能撇号转换为普通撇号解决乱码问题
问题描述
- 基于Summernote所见即所得编辑器接收用户输入字符串,当用户从Google Docs等平台粘贴文本时,内容会携带类似
child’s中的特殊撇号 - 内容存储的数据库配置为:字符集utf8mb4,排序规则utf8mb4_unicode_ci
- 前端展示异常:Mac端Safari浏览器中该特殊撇号会显示为问号,PC端Chrome浏览器显示正常
- 邮件发送异常:通过AWS Simple Email Service调用PHPMailer发送包含该特殊撇号的邮件时,发送流程会直接中断
- 核心需求:在数据存入数据库前,就将这类特殊字符统一转换为普通撇号
已尝试的无效方案
执行以下代码均无法实现替换效果:
$str = mb_convert_encoding($str, 'UTF-8','utf8mb4'); $str = str_replace("’","'",$str); $str = strtr($str,array("’" => "'"));
编码检测结果为UTF-8:echo mb_detect_encoding($str); // 输出结果为UTF-8
已参考同类问题的所有答案(包含未被采纳的答案),测试后均无效果。
可行解决方案
通过匹配各类特殊标点的UTF-8字节序列,批量替换为对应的普通标点即可解决问题,实现代码如下:
function convert_smart_quotes($string) { $search = [ "\xC2\xAB", // « (U+00AB) UTF-8编码 "\xC2\xBB", // » (U+00BB) UTF-8编码 "\xE2\x80\x98", // ‘ (U+2018) UTF-8编码 "\xE2\x80\x99", // ’ (U+2019) UTF-8编码 "\xE2\x80\x9A", // ‚ (U+201A) UTF-8编码 "\xE2\x80\x9B", // ‛ (U+201B) UTF-8编码 "\xE2\x80\x9C", // “ (U+201C) UTF-8编码 "\xE2\x80\x9D", // ” (U+201D) UTF-8编码 "\xE2\x80\x9E", // „ (U+201E) UTF-8编码 "\xE2\x80\x9F", // ‟ (U+201F) UTF-8编码 "\xE2\x80\xB9", // ‹ (U+2039) UTF-8编码 "\xE2\x80\xBA", // › (U+203A) UTF-8编码 "\xE2\x80\x93", // – (U+2013) UTF-8编码 "\xE2\x80\x94", // — (U+2014) UTF-8编码 "\xE2\x80\xA6" // … (U+2026) UTF-8编码 ]; $replacements = [ "<<", ">>", "'", "'", "'", "'", '"', '"', '"', '"', "<", ">", "-", "-", "..." ]; return str_replace($search, $replacements, $string); }
内容的提问来源于stack exchange,提问作者Cary
相关产品推荐
相关产品推荐

