PHP中如何将Unicode转换为UTF-16以适配数据库搜索需求
核心结论
你数据库中存储的并非原始UTF-16二进制字节,而是\u+4位十六进制码值格式的Unicode码点转义序列,只要将POST传入的UTF-8字符串转为同格式的转义结果即可完成匹配。
可用实现方案
方案1:直接生成匹配格式的转义字符串
极简实现(利用JSON内置转义逻辑)
PHP的json_encode默认会把非ASCII字符转为你需要的\uXXXX格式,只需去掉序列化自动添加的首尾引号即可:
function utf8_to_unicode_escape(string $input): string { // 确保输入为UTF-8编码 if (!mb_check_encoding($input, 'UTF-8')) { $input = mb_convert_encoding($input, 'UTF-8'); } return trim(json_encode($input), '"'); } // 测试用例 echo utf8_to_unicode_escape('基本的'); // 输出:\u57fa\u672c\u7684,和你数据库存储格式完全匹配
手动编码实现(无需依赖JSON序列化)
如果需要自定义转义逻辑可以用这个版本:
function utf8_to_unicode_escape(string $input): string { $result = ''; $charLength = mb_strlen($input, 'UTF-8'); for ($i = 0; $i < $charLength; $i++) { $singleChar = mb_substr($input, $i, 1, 'UTF-8'); // 转为UCS-2BE格式读取16位码点 $ucs2Bytes = mb_convert_encoding($singleChar, 'UCS-2BE', 'UTF-8'); $codePoint = unpack('n', $ucs2Bytes)[1]; $result .= sprintf('\u%04x', $codePoint); } return $result; }
方案2:长期优化方案(更推荐)
数据库存储转义后的字符串会额外占用存储空间、降低查询效率,建议将数据库/表的字符集修改为utf8mb4,直接存储原始UTF-8字符串,查询时直接用POST传入的原始参数匹配即可,无需任何转码操作。
你之前代码的问题说明
utf8_encode仅适用于将ISO-8859-1编码转为UTF-8,输入本身是UTF-8时调用会产生乱码mb_convert_encoding参数顺序错误:第二个参数是目标编码,第三个才是输入的原始编码,你之前的调用混淆了编码对应关系,导致输出乱码- 混淆了「UTF-16原始二进制字节」和「Unicode码点转义文本」两个概念,你数据库中存储的是可读的文本转义结果,不是原始二进制编码。
内容的提问来源于stack exchange,提问作者Dula
相关产品推荐
相关产品推荐

