比较 UTF-8 字符串
2022-08-31 00:47:34
我试图比较两个字符串,比如Émilie和Zoey。好吧,“E”在“Z”之前,但在ASCII图表上,Z在É之前,所以正常的不起作用。if ( str1 > str2 )
我尝试了仍然不起作用。所以我正在寻找一种将字符串与UTF-8字符进行比较的本机方法。if (strcmp(str1,str2) > 0)
我试图比较两个字符串,比如Émilie和Zoey。好吧,“E”在“Z”之前,但在ASCII图表上,Z在É之前,所以正常的不起作用。if ( str1 > str2 )
我尝试了仍然不起作用。所以我正在寻找一种将字符串与UTF-8字符进行比较的本机方法。if (strcmp(str1,str2) > 0)
重要
此答案适用于无法运行/安装“intl”扩展的情况,并且仅通过将重音字符替换为非重音字符来对字符串进行排序。若要根据特定区域设置对重音字符进行排序,使用排序规则器是一种更好的方法 - 有关详细信息,请参阅此问题的其他答案。
PHP 5.2 中按非重音字符排序
您可以尝试使用iconv()和//TRANSLIT选项将两个字符串转换为ASCII,以摆脱重音字符;
$str1 = iconv('utf-8', 'ascii//TRANSLIT', $str1);
然后进行比较
请参阅此处的文档:
http://www.php.net/manual/en/function.iconv.php
[已更新,以回应@Esailija的评论]我忽略了 //TRANSLIT 以意想不到的方式翻译重音字符的问题。这个问题在这个问题中提到:php iconv音译用于删除重音符号:不按例外工作?
为了使“iconv()”方法有效,我在下面添加了一个代码示例,该示例使用preg_replace()从生成的字符串中去除所有非单词字符。
<?php
setLocale(LC_ALL, 'fr_FR');
$names = array(
'Zoey and another (word) ',
'Émilie and another word',
'Amber',
);
$converted = array();
foreach($names as $name) {
$converted[] = preg_replace('#[^\w\s]+#', '', iconv('UTF-8', 'ASCII//TRANSLIT', $name));
}
sort($converted);
echo '<pre>'; print_r($converted);
// Array
// (
// [0] => Amber
// [1] => Emilie and another word
// [2] => Zoey and another word
// )
没有本地方法可以做到这一点,但是PECL扩展:http://php.net/manual/de/class.collator.php
$c = new Collator('fr_FR');
if ($c->compare('Émily', 'Zoey') < 0) { echo 'Émily < Zoey'; }