PHP:Замените умлауты ближайшим 7-битным эквивалентом ASCII в строке UTF-8.

StackOverflow https://stackoverflow.com/questions/158241

  •  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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top