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

特殊粗体字符「𝐌𝐞𝐱𝐢𝐜𝐨」与「Mexico」的PHP/MySQL匹配问题

解决特殊粗体字符「𝐌𝐞𝐱𝐢𝐜𝐨」与普通「Mexico」的匹配问题

一、两者的核心差异

你遇到的问题本质是字符编码完全不同:普通「Mexico」是标准拉丁字母,每个字符的Unicode编码是常规范围(比如M是U+004D,e是U+0065);而粗体「𝐌𝐞𝐱𝐢𝐜𝐨」属于Unicode数学粗体字符,每个字母都是独立的特殊码点(比如𝐌是U+1D40C,𝐞是U+1D412)。两者编码无关联,所以直接用==或LIKE肯定匹配不上。

二、SQL查询实现匹配的解决方案

方案1:转换搜索关键词后查询

如果数据库里只存了粗体版本,先把用户输入的普通「Mexico」转成粗体「𝐌𝐞𝐱𝐢𝐜𝐨」,再执行查询:

SELECT * FROM `content` LIKE "%𝐌𝐞𝐱𝐢𝐜𝐨%"

方案2:统一转换为普通字符匹配(更通用)

创建自定义函数,把数据库字段里的粗体字符转成普通字符,再和用户输入匹配:

DELIMITER //
CREATE FUNCTION unbold_math_text(s VARCHAR(255)) RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
    -- 逐个替换粗体字符为普通字符,可按需扩展更多字母
    RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        s,
        '𝐌', 'M'), '𝐞', 'e'), '𝐱', 'x'), '𝐢', 'i'), '𝐨', 'o');
END //
DELIMITER ;

查询时调用函数:

SELECT * FROM `content` WHERE unbold_math_text(`content`) LIKE "%Mexico%"

如果是MySQL 8.0+,可以用正则替换更高效:

SELECT * FROM `content` 
WHERE REGEXP_REPLACE(`content`, '[\\x{1D40C}\\x{1D412}\\x{1D41B}\\x{1D418}\\x{1D41F}]', 
    CASE 
        WHEN REGEXP_SUBSTR(`content`, '[\\x{1D40C}]') THEN 'M'
        WHEN REGEXP_SUBSTR(`content`, '[\\x{1D412}]') THEN 'e'
        WHEN REGEXP_SUBSTR(`content`, '[\\x{1D41B}]') THEN 'x'
        WHEN REGEXP_SUBSTR(`content`, '[\\x{1D418}]') THEN 'i'
        WHEN REGEXP_SUBSTR(`content`, '[\\x{1D41F}]') THEN 'o'
    END) LIKE "%Mexico%"

三、PHP转换方法

方法1:手动映射替换

直接创建字符映射数组,快速转换:

$boldToNormal = [
    '𝐌' => 'M', '𝐞' => 'e', '𝐱' => 'x', '𝐢' => 'i', '𝐨' => 'o',
    // 可添加其他需要转换的粗体字母
];
$boldStr = "𝐌𝐞𝐱𝐢𝐜𝐨";
$normalStr = strtr($boldStr, $boldToNormal);
// 此时$normalStr为"Mexico",可用于比较或构造SQL查询

方法2:批量编码转换(支持全字母)

利用Unicode编码偏移量,批量把所有数学粗体字母转成普通字母:

function convertBoldMathToNormal($str) {
    $result = '';
    $len = mb_strlen($str);
    for ($i = 0; $i < $len; $i++) {
        $char = mb_substr($str, $i, 1);
        $code = mb_ord($char);
        // 处理大写粗体字母(U+1D400 ~ U+1D419)
        if ($code >= 0x1D400 && $code <= 0x1D419) {
            $normalCode = $code - 0x1D400 + 0x0041;
            $result .= mb_chr($normalCode);
        }
        // 处理小写粗体字母(U+1D41A ~ U+1D433)
        elseif ($code >= 0x1D41A && $code <= 0x1D433) {
            $normalCode = $code - 0x1D41A + 0x0061;
            $result .= mb_chr($normalCode);
        }
        // 非粗体字符直接保留
        else {
            $result .= $char;
        }
    }
    return $result;
}

// 测试
$a = "𝐌𝐞𝐱𝐢𝐜𝐨";
$b = "Mexico";
echo convertBoldMathToNormal($a) == $b ? "Same" : "Not same"; // 输出Same

内容的提问来源于stack exchange,提问作者Web Star

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:52:50