PHP: заменить умляуты ближайшим 7-битным эквивалентом ASCII в строке UTF-8 - PullRequest
43 голосов
/ 01 октября 2008

Что я хочу сделать, это удалить все акценты и умлауты из строки, превратив «lärm» в «larm» или «andré» в «andre». Я попытался сделать utf8_decode строки, а затем использовать для нее strtr, но поскольку мой исходный файл сохраняется как файл UTF-8, я не могу ввести символы ISO-8859-15 для всех умляутов - редактор вставляет UTF-8 символов.

Очевидно, что для решения этой проблемы будет иметь включение, которое является файлом ISO-8859-15, но должен быть лучший способ, чем иметь другое обязательное включение?

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

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

Ответы [ 7 ]

53 голосов
/ 01 октября 2008
iconv("utf-8","ascii//TRANSLIT",$input);

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

26 голосов
/ 10 мая 2011

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

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

5 голосов
/ 03 февраля 2016

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

$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 в наличии

0 голосов
/ 01 июня 2018

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

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

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

0 голосов
/ 24 августа 2016

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

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 
0 голосов
/ 08 ноября 2014

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

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

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

ـَ (0243) ـِ (0246) ـُ (0245) ـً (0240) ـٍ (0242) ـٌ (0241) ـْ (0250) ـّ (0248) ـ (0220)

0 голосов
/ 01 октября 2008

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

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