Я пытаюсь нормализовать строки с такими символами, как «ééóúú», чтобы «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áàä, êëéè
Что должно делать нормализация?
— — EDITED
Это странно. Когда вы копируете и вставляете результат из веб-браузера, а на странице редактора и оригинала я вижу:
FORM_D: aáàä, êëéè
на странице вопроса stackoverflow, которую я вижу (только в режиме Code Sample):
FORM_D: aáàä, êëéè
Найдено на этой странице :
Юникод и интернационализация – большая тема, но вы должны знать хотя бы еще одну важную вещь. По историческим причинам 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
.
Для функции, которая фактически удаляет акценты, лучшее, что я нашел до сих пор, находится в ядре wordpress: https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php#L1127 remove_accents ($ строка)
(Примечание. Я подал на него ошибку, чтобы получить обновленную версию, в которой я указывал, какие документы имеют каждый символ и как он транслируется, поэтому он может измениться в будущем)
То, что вы ищете, – iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text)
.
http://php.net/manual/de/function.iconv.php
Будьте осторожны с настройками LC_*
! В зависимости от настройки транслитерация может измениться.