Преобразование диакритических знаков PHP работает не так, как ожидалось

#php #encoding

Вопрос:

Мне нужна помощь в удалении диакретических знаков.

У меня Ä закодирован следующий символ UTF-8 , и я хочу удалить две точки: Ä -> A

Но я также хочу, чтобы это было для всех существующих персонажей (или для большинства), как это:

 Ä => A    È => E    Ö -> O    Ü -> U
À => A    Ê => E    Ô -> O    Û -> U
 => A    É => E    Ò -> O    Ù -> U    ...
 

Я также нашел функцию Normalizer::normalize , но при ее применении все Ä равно возвращается то же самое: Ä .

Есть какие-нибудь идеи? Спасибо!

Ответ №1:

Я держу эту функцию в заднем кармане для таких случаев:

 <?php

function replaceAccents(string $str): string
{
    $str = htmlentities($str, ENT_COMPAT, "UTF-8");
    $str = preg_replace('/amp;([a-zA-Z])(uml|acute|grave|circ|tilde|ring);/', '$1', $str);
    return html_entity_decode($str);
}

$input = 'ÄÈÖÜÀÊÔÛÂÉÒÙ';
$output = replaceAccents($input);


echo $output.PHP_EOL;
 

Выход:

 AEOUAEOUAEOU
 

Я не уверен, что это самое элегантное решение, но оно эффективно.