特殊粗体字符「𝐌𝐞𝐱𝐢𝐜𝐨」与「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
相关产品推荐
相关产品推荐

