2009-06-19 57 views
1

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

首先,我正在对字符串进行一些基本的删除操作,以删除空格,引号,连字符,括号等。问题出在我使用默认语言环境将字符串传递到strcoll()时,因为它不够智能例如,将重音符号e视为按字典顺序等同于正常的e。

我很谨慎使用德语或法语等语言环境,因为它可能不会包含我需要考虑的所有特殊字符。是否有一个语言环境会给我类似于latin1_general_ci排序规则的内容?或者是否有另一种解决方案?

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

另外在那个说明中,strcmp()strcasecmp()尊重当前语言环境的排序规则,还是仅仅是strcoll()这样做?

回答

1

也许这:

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

strcmp()strcasecmp()未本地化。

+0

那是法国人吗?德语中不会有字符,在这种排序中不会被记录下来吗?或者FR做了一些特别的事情? 我确实找到了一个“Indo-European”区域设置,我目前正在测试它是否会生成所需的结果并为我之后的特殊字符进行帐户。 – 2009-06-19 01:39:13

+0

这是法语,但我试图使用.Latin1/.Latin-1修饰符来强制该字符集。真正被接受的是神秘的部分。 – chaos 2009-06-19 01:42:12

0

您还可以尝试使用iconv函数来帮助标准化字符串。这将处理重读的e到正常的情况。请参阅有关sorting utf8 strings的相关问题。