Подтвердить что ты не робот

PHP: замените umlauts ближайшим 7-разрядным эквивалентом ASCII в строке UTF-8

Что я хочу сделать, так это удалить все акценты и умляуты из строки, превратив "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');

ОБНОВЛЕНИЕ: Возможно, я был немного неточен тем, что я пытаюсь сделать: на самом деле я не хочу удалять умлауты, а заменять их ближайшим эквивалентом "один символ ASCII".

4b9b3361

Ответ 1

iconv("utf-8","ascii//TRANSLIT",$input);

Расширенный пример

Ответ 2

Небольшой трюк, который не требует установки локалей или наличия огромных таблиц перевода:

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 (как и должно быть).

Ответ 3

вы также можете попробовать это

$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

Ответ 4

Хорошо, нашел явное решение самостоятельно, но это не самое лучшее в отношении производительности...

echo strtr(utf8_decode($input), 
           utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

Ответ 5

Для арабских и персидских пользователей я рекомендую этот способ удаления диакритики:

    $diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ');
    $search_txt = str_replace($diacritics, '', $diacritics);

Для ввода диакритических знаков на арабских клавиатурах вы можете использовать эти коды Asci (эти коды Asci not Unicode) в редакторах Windows ввод диакритики напрямую или удерживание Alt + (введите код диакритического характера) Это коды

<0 > 0243 (0246) (0245) (0240) (0242) (0241) (0250) (0248) (0220)

Ответ 6

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

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 

Ответ 7

Если вы используете WordPress, вы можете использовать встроенную функцию remove_accents( $string )

https://codex.wordpress.org/Function_Reference/remove_accents

Однако я заметил ошибку: она не работает с строкой с одним символом.