我正在编写一个字符串比较函数来排序医学术语,这些术语通常包含来自许多不同欧洲语言的特殊重音字符,我需要以某种方式实现类似于MySQL的 latin1_general_ci 的校对。

首先,我正在对字符串进行一些基本的修改以删除空格,引号,连字符,括号等。当我使用默认值将字符串传递给 strcoll()时出现问题语言环境,因为它不够智能,例如,重音e在字典上等同于普通e。

我很想使用像德语或法语这样的语言环境,因为它可能不会包含我需要考虑的所有特殊字符。是否有一个区域设置会给我一些类似于 latin1_general_ci 排序规则的东西?或者是否有其他解决方案?

我天真的解决方案是创建一个大的关联数组,将重音字母映射到它们的常规字母等价物,然后将其与 str_replace()一起使用,但这听起来既缓慢又乏味(而且容易出错) )。如果可能的话,我宁愿使用语言中内置的东西。

同样在那个注释中, strcmp() strcasecmp()是否尊重当前语言环境的排序规则,或者只是 strcoll()这样做?

有帮助吗?

解决方案

也许这个:

setlocale(LC_COLLATE, 'fr_FR.Latin1', 'fr.Latin1', 'fr_FR.Latin-1', 'fr.Latin-1');

strcmp() strcasecmp()未本地化。

其他提示

您还可以尝试使用 iconv 功能来帮助规范化字符串。这将处理正常情况下的重音。请参阅有关对utf8字符串进行排序的相关问题也是。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top