Заменить диакритические знаки на «эквивалентный» ASCII в PHP? - PullRequest
14 голосов
/ 16 апреля 2010

Похожие вопросы:

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

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

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

Ответы [ 4 ]

32 голосов
/ 16 апреля 2010

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

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

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

2 голосов
/ 04 ноября 2013

Я нашел другое решение, основанное на ответе @ 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
2 голосов
/ 16 апреля 2010

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

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

$result = str_replace(str_split($from), str_split($to), $text);
1 голос
/ 16 апреля 2010

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

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', '$1', $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 Friendly Username в PHP?

...