7

我正在尝试将带有 'áéíóú' 之类的字符的字符串标准化为 'aeiou' 以简化搜索。

在对这个问题的回答之后,我应该使用这个Normalizer类来做这件事。

问题是该normalize函数什么都不做。例如,该代码:

<?php echo 'Pérez, NFC: ' . normalizer_normalize('Pérez', Normalizer::NFC) 
    . ' NFD: ' .normalizer_normalize('Pérez', Normalizer::NFD)
    . ' NFKC: ' .normalizer_normalize('Pérez', Normalizer::NFKC) 
    . ' NFKD: ' .normalizer_normalize('Pérez', Normalizer::NFKD)?>
<br/>
<?php echo 'aáàä, êëéè,' 
    . ' FORM_C: ' . normalizer_normalize('aáàä, êëéè', Normalizer::FORM_C )
    . ' FORM_D: ' .normalizer_normalize('aáàä, êëéè', Normalizer::FORM_D)
    . ' FORM_KC: ' .normalizer_normalize('aáàä, êëéè', Normalizer::FORM_KC)
    . ' FORM_KD: ' .normalizer_normalize('aáàä, êëéè', Normalizer::FORM_KD)?>

显示:

Pérez, NFC: Pérez NFD: Pérez NFKC: Pérez NFKD: Pérez
aáàä, êëéè, FORM_C: aáàä, êëéè FORM_D: aáàä, êëéè FORM_KC: aáàä, êëéè FORM_KD: aáàä, êëéè 

什么是正常化必须做的?

---已编辑---

这是陌生的。从网络浏览器复制和粘贴结果时,在编辑器和原始页面中我可以看到:

FORM_D: aáàä, êëéè

在stackoverflow问题页面中我可以看到(仅在代码示例模式下):

FORM_D: aáàä, êëéè
4

4 回答 4

10

此页面上找到:(链接的文件有不同的措辞,旧的不再存在了)

Unicode 和国际化是一个很大的话题,但您至少应该知道一件更重要的事情。由于历史原因,Unicode 允许某些字符的替代表示。例如,á 可以写成一个带有 Unicode 代码点 U+00E1 的预组合字符 á,也可以写成字母 a (U+0061) 和重音 ´ (U+0301) 的分解序列。为了比较和排序的目的,两个这样的表示应该被认为是相等的。为了解决这个问题,intl 库提供了 Normalizer 类。此类又提供了 normalize() 方法,您可以使用该方法将字符串转换为规范化的组合或分解形式。在执行比较之前,您的应用程序应始终将所有字符串转换为一种或另一种形式。

echo Normalizer::normalize("a´", Normalizer::FORM_C); // á  
echo Normalizer::normalize("á", Normalizer::FORM_D); // a´

所以消除重音(和类似的)不是Normalizer.

于 2013-08-30T11:44:04.150 回答
10

NormalizerwithFORM_D可以将变音符号从基本字符中分离出来,然后preg_replace可以消除变音符号:

$string = 'áéíóú';
echo preg_replace('/[\x{0300}-\x{036f}]/u', "", Normalizer::normalize($string , Normalizer::FORM_D));
//aeiou
于 2019-04-07T06:42:46.417 回答
2

您正在寻找的是iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text).

http://php.net/manual/function.iconv.php

小心LC_*设置!根据设置,音译可能会发生变化。

于 2017-06-15T13:39:12.947 回答
1

对于实际删除重音的功能,到目前为止我发现的最好的是在 wordpress 核心中: https ://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php#L1127 删除口音($字符串)

(注意我已经针对它提交了一个错误,以便他们采用我提供的更新版本,其中记录了每个字符以及它是如何被翻译的。所以它可能会在未来发生变化)

于 2015-11-14T01:02:49.630 回答