字符串编码转换问题,Unicode归一化。大佬帮忙看一下,谢谢

字符串中包含特殊字符,怎么转换成正常的字符?

下边是示例代码:

$a = 'Аdult dating';
$b = 'Adult dаting';
// $a中的'A'和$b中的'a'都是特殊字符
$res = $a == $b;
var_dump($res);
var_dump(strlen($a));
var_dump(strlen($b));

$x1 = 'Adult dating';
$x2 = 'Adult dating';
$res_x = $x1 == $x2;
var_dump($res_x);
var_dump(strlen($x1));
var_dump(strlen($x2));

输出结果:

bool(false)
int(13)
int(13)
bool(true)
int(12)
int(12)

经过一系列测试:

// 使用https://www.php.net/manual/zh/normalizer.normalize.php中的normalizeUtf8String方法
$a2 = normalizeUtf8String($a);
// 输出:string(11) "dult dating"
// 函数中$s = Normalizer::normalize($s, Normalizer::FORM_KD);使用兼容规范
// 函数的$s = preg_replace('@[^\0-\x80]@u', "", $s);去除了特殊字符

// unicode转换测试 函数代码参见https://blog.csdn.net/wjycgl/article/details/80302930
$a4 = unicode_encode($a);
var_dump($a4);
// 输出:string(72) "\ud090\u0064\u0075\u006c\u0074\u0020\u0064\u0061\u0074\u0069\u006e\u0067"
$a5 = unicode_decode($a4);
var_dump($a5);
// 输出:string(14) "킐dult dating"

问题是,怎么处理,才能从$a$b得到$x1,$x2正常的值?

是通用化的处理,不是用数组归集特殊字符来替换的方法。
阅读 295
评论
    1 个回答
    • 8.8k
    是通用化的处理,不是用数组归集特殊字符来替换的方法。

    没有。

    你举得这个例子,在 Unicode 看来,一个是拉丁字母,一个是西里尔字母,虽然长得像,但是不存在任何映射关系。你要映射这些,只能自己做 map 。(还得保证你不会处理任何使用西里尔字母的语言)

      撰写回答

      登录后参与交流、获取后续更新提醒