Заменить диакритические символы на "эквивалентные" ASCII в PHP?

вопросы:

  1. как заменить символы в строке java?
  2. как заменить специальные символы их эквивалентом (например, " á " для "a") В C#?

Как и в вопросах выше, я ищу надежный, надежный способ уменьшить любой символ Юникода до почти эквивалентного ASCII с помощью PHP. Я действительно хочу избежать сворачивания моего собственного стола.

например (украдено с 1 ссылочный вопрос):Gračišće становится Gracisce

4 ответов


на iconv модуль может сделать это, более конкретно,iconv () функция:

$str = iconv('Windows-1252', 'ASCII//TRANSLIT//IGNORE', "Gracišce");
echo $str;
//outputs "Gracisce"

основная проблема с iconv заключается в том, что вам просто нужно смотреть свои кодировки, но это определенно правильный инструмент для работы (я использовал "Windows-1252" для примера из-за ограничений текстового редактора, с которым я работал ;) функция iconv, которую вы определенно хотите использовать, - это //TRANSLIT флаг, который сообщает iconv для транслитерации любых символов, которые не имейте соответствие ASCII в ближайшем приближении.


мое решение-создать две строки - во-первых, с нежелательными буквами и во-вторых с буквами, которые заменят первые.

$from = 'čšć';
$to   = 'csc';
$text = 'Gračišće';

$result = str_replace(str_split($from), str_split($to), $text);

Я нашел другое решение, основанное на ответе @zombat.

проблема с его ответом заключалась в том, что я получал:

Notice: iconv() [function.iconv]: Wrong charset, conversion from `UTF-8' to `ASCII//TRANSLIT//IGNORE' is not allowed in D:\www\phpcommand.php(11) : eval()'d code on line 3

и после удаления //IGNORE из функции, я получил:

Gr'a'e~a~o^O"ucisce

Итак,š символ был переведен правильно, но другие символы не были.

решение, которое сработало для меня, - это смесь между preg_replace (чтобы удалить все, кроме [a-zA-Z0-9] - включая пробелы) и @zombat решение:

preg_replace('/[^a-zA-Z0-9.]/','',iconv('UTF-8', 'ASCII//TRANSLIT', "GráéãõÔücišce"));

выход:

GraeaoOucisce

попробуйте это:

function normal_chars($string)
{
    $string = htmlentities($string, ENT_QUOTES, 'UTF-8');
    $string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '', $string);
    $string = preg_replace(array('~[^0-9a-z]~i', '~-+~'), ' ', $string);
    return trim($string);
}

Examples:

echo normal_chars('Álix----_Ãxel!?!?'); // Alix Axel
echo normal_chars('áéíóúÁÉÍÓÚ'); // aeiouAEIOU
echo normal_chars('üÿÄËÏÖÜŸåÅ'); // uyAEIOUYaA

на основе выбранного ответа в этой теме: url дружественное имя Пользователя в PHP?