You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:15:03