Преобразование ASCII и UTF-8 в не специальные символы с помощью одной функции - PullRequest
4 голосов
/ 23 сентября 2011

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

Они заполняют эту базу данных черезвнешней программы, и у меня нет возможности изменить способ получения данных.

Теперь у меня возникает следующая проблема, иногда я получаю строки в UTF-8, а иногда в ASCII (надеюсь, у меня есть этиусловия правильные, они все еще немного расплывчаты для меня иногда).

Таким образом, я мог получить либо: Scénic, либо Scénic.

Теперь проблема в том, что мне нужно преобразовать это в не специальные символы (чтобы оно стало Scenic) для URL.

Я не думаю, что есть функция для преобразования é в e (если есть, сообщите), поэтому мне, вероятно, потребуется создать массив для этого, содержащий все исходные тексты.и пункты назначения, но большая проблема заключается в преобразовании é в é без прерывания é, когда оно проходит через эту функцию.

Или я должен просто создать массив, содержащий everything (так, например: array('é'=>'e','é'=>'e'); и т. д.

Я знаю, как получить é до é, выполнив utf8_encode(html_entity_decode('é')), однако, поместив é через эту же функцию, вы получите é.

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

1 Ответ

11 голосов
/ 23 сентября 2011

Благодаря @XzKto и этому комментарию на PHP.net я изменил свою функцию slug на следующее:

static function slug($input){

    $string = html_entity_decode($input,ENT_COMPAT,"UTF-8");

    $oldLocale = setlocale(LC_CTYPE, '0');  

    setlocale(LC_CTYPE, 'en_US.UTF-8');
    $string = iconv("UTF-8","ASCII//TRANSLIT",$string);

    setlocale(LC_CTYPE, $oldLocale);

    return strtolower(preg_replace('/[^a-zA-Z0-9]+/','-',$string));

}

Я чувствую, что часть setlocale немного грязнаяно это прекрасно работает для перевода специальных символов в их «нормальные» эквиваленты.

Ввод a áñö ïß éèé возвращает a-ano-iss-eee

...