Как мне добиться чего-то вроде сортировки MySQL latin1_general_ci в PHP? - PullRequest
1 голос
/ 19 июня 2009

Я пишу функцию сравнения строк для сортировки медицинских терминов, которые часто содержат специальные акцентированные символы из разных европейских языков, и мне нужно каким-то образом добиться сопоставления, аналогичного latin1_general_ci.

MySQL.

Во-первых, я делаю некоторые базовые манипуляции со строками, чтобы удалить пробелы, кавычки, дефисы, скобки и т. Д. Проблема возникает, когда я передаю строки в strcoll() с использованием локали по умолчанию, потому что это не очень разумно достаточно, чтобы считать, например, акцентированное e как лексикографически эквивалентное нормальному e.

Я осторожен в использовании локали, такой как немецкий или французский, потому что она, вероятно, не будет включать в себя все специальные символы, которые мне нужно учитывать. Есть ли локаль, которая даст мне что-то похожее на сопоставление latin1_general_ci? Или, может быть, есть другое решение?

Моим наивным решением было бы создать большой ассоциативный массив для сопоставления акцентированных букв с их обычными буквенными эквивалентами, затем использовать это с str_replace(), но это звучит медленно и утомительно (и подвержено ошибкам). Я бы предпочел использовать что-то встроенное в язык, если это возможно.

Также на этой ноте, strcmp() или strcasecmp() учитывает сопоставление текущей локали, или это просто strcoll(), что делает это?

Ответы [ 2 ]

1 голос
/ 19 июня 2009

Может быть, это:

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

strcmp() и strcasecmp() не локализованы.

0 голосов
/ 19 июня 2009

Вы также можете попробовать функции iconv , чтобы помочь нормализовать строки. Это поможет справиться с обычными электронными ситуациями. См. Также этот связанный вопрос о сортировке строк utf8 .

...