PHP:Замените умлауты ближайшим 7-битным эквивалентом ASCII в строке UTF-8.
-
03-07-2019 - |
Вопрос
Я хочу удалить из строки все ударения и умлауты, превратив «lärm» в «larm» или «andré» в «andre».Я пытался utf8_decoded строку, а затем использовать для нее strtr, но поскольку мой исходный файл сохранен как файл UTF-8, я не могу ввести символы ISO-8859-15 для всех умлаутов - редактор вставляет Символы UTF-8.
Очевидно, что решением этой проблемы было бы включение в виде файла ISO-8859-15, но должен ли быть лучший способ, чем иметь еще одно обязательное включение?
echo strtr(utf8_decode($input),
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
ОБНОВЛЯТЬ: Возможно, я немного неточно выразился в том, что пытаюсь сделать:На самом деле я хочу не удалять умлауты, а заменить их ближайшим эквивалентом «односимвольного 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('~&([a-z]{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.
ـَ(0243) ـِ(0246) ـُ(0245) ـً(0240) ـٍ(0242) ـٌ(0241) ـْ(0250) ـّ(0248) ـ ـ(0220)
Я обнаружил, что этот вариант дает наиболее стабильные результаты на французском и немецком языках.с метатегом, установленным на utf-8
, Я поместил его в функцию, возвращающую строку из массива слов, и она отлично работает.
htmlentities ( $line, ENT_SUBSTITUTE , 'utf-8' )
Если вы используете WordPress, вы можете использовать встроенную функцию remove_accents( $string )
https://codex.wordpress.org/Function_Reference/remove_accents
Однако я заметил ошибку:он не работает со строкой, состоящей из одного символа.