Связанные вопросы:
Как и в вышеприведенных вопросах, я ищу надежный и надежный способ уменьшить любой символ Юникода до почти эквивалентного ASCII с помощью PHP. Я действительно хочу не сворачивать собственный стол.
Например (украденный с 1-го упоминаемого вопроса): Gračišće
становится Gracisce
Модуль 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);
Попробуй это:
function normal_chars($string) { $string = htmlentities($string, ENT_QUOTES, 'UTF-8'); $string = preg_replace('~&([az]{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?
Я нашел другое решение, основанное на ответе @ 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