Я хочу, чтобы удалить все акценты и умлауты из строки, превратив «lärm» в «larm» или «andré» в «andre». То, что я пытался сделать, это utf8_decode строку, а затем использовать strtr на ней, но поскольку мой исходный файл сохраняется как файл UTF-8, я не могу вводить символы ISO-8859-15 для всех умляутов – редактор вставляет Символы UTF-8.
Очевидно, решение для этого было бы включать в себя файл ISO-8859-15, но должен быть лучший способ, чем иметь еще один требуемый include?
echo strtr(utf8_decode($input), 'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ', 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
UPDATE: Возможно, я был немного неточен тем, что я пытаюсь сделать: на самом деле я не хочу удалять умлауты, но вместо них их ближайший эквивалент «один символ ASCII».
iconv("utf-8","ascii//TRANSLIT",$input);
Расширенный пример
Небольшой трюк, который не требует установки локалей или наличия огромных таблиц перевода:
function Unaccent($string) { if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false) { $string = html_entity_decode(preg_replace('~&([az]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8'); } return $string; }
Единственное требование для его правильной работы – сохранить ваши файлы в UTF-8 (как вы уже должны были).
вы также можете попробовать это
$string = "Fóø Bår"; $transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD); echo $normalized = $transliterator->transliterate($string);
но вам нужно иметь http://php.net/manual/en/book.intl.php
Хорошо, я нашел очевидное решение, но это не лучший результат.
echo strtr(utf8_decode($input), utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'), 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
Для арабских и персидских пользователей я рекомендую этот способ удалить диакритические знаки:
$diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ'); $search_txt = str_replace($diacritics, '', $diacritics);
Для ввода диакритических знаков на арабских клавиатурах вы можете использовать эти коды Asci (эти коды Asci не Unicode) в редакторах Windows, набирая диакритические символы напрямую или удерживая Alt + (введите код диакритического символа). Это коды
(0243) (0246) (0245) (0240) (0242) (0241) (0250) (0248) (0220)
Я обнаружил, что это дает самые последовательные результаты на французском и немецком языках. с метатегом, установленным в utf-8
, я помещаю его в функцию, чтобы возвращать строку из массива слов, и она отлично работает.
htmlentities ( $line, ENT_SUBSTITUTE , 'utf-8' )