PHP: исправление проблем с кодировкой содержимого базы данных - удаление акцентов с символов - PullRequest
0 голосов
/ 07 августа 2010

Я пытаюсь создать безопасную для URL версию строки.

В моей базе данных у меня есть значение medúlla - я хочу превратить это в medulla.

Я нашел множество функций для этого, но когда я извлекаю значение из базы данных, оно возвращается как medúlla.

Я пробовал:

  • Установка столбца в качестве кодировки utf_8
  • Установка таблицы в качестве кодировки utf_8
  • Установка всей базы данных в качестве кодировки utf_8
  • Запуск `SET NAMES utf8` в базе данных перед запросом

Когда я отображаю значение на экране, оно отображается так, как я хочу, но функция преобразования не видит символ ú (даже простой str_replace() тоже не работает).

Кто-нибудь знает, как я могу заставить систему распознавать это как UTF-8 и разрешить мне выполнять преобразование?

Спасибо, Matt

Ответы [ 2 ]

2 голосов
/ 07 августа 2010

Чтобы преобразовать строку UTF-8 в строку, безопасную для URL, вы должны использовать:

$str = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $strt);

Часть IGNORE сообщает iconv() не вызывать исключение при обращении к символу, которым не может управлять, а часть TRANSLIT преобразует символ UTF-8 в его ближайший эквивалент ASCII ('ú' в 'u' и т. д.).

Следующий шаг состоит в том, чтобы preg_replace () пробел в подчеркивание и замену или удаление любого символачто небезопасно в URL , либо с preg_replace(), либо с urlencode().

Что касается базы данных, вы действительно должны были сделать все эти настройки перед INSERTing UTF-8 content,Изменение набора символов в существующую таблицу похоже на изменение расширения файла в Windows - оно не конвертирует JPEG в GIF.Но не беспокойтесь и помните, что база данных будет возвращать вам побайтово то, что вы в ней сохранили, независимо от того, какая кодировка была объявлена.Просто сохраните настройки, которые вы использовали при вставке, и возвращайте возвращаемые строки как UTF-8.

1 голос
/ 08 августа 2010

Я пытаюсь создать безопасную для URL версию строки.

Хотя обычно в URL-адресах используются только слагы ASCII, на самом деле возможноиметь веб-адреса, включая символы не ASCII.например ::

http://en.wikipedia.org/wiki/Medúlla

Это действительный IRI.Для включения в U RI, вы должны UTF-8 и% -кодировать его:

http://en.wikipedia.org/wiki/Med%C3%BAlla

В любом случае, большинство браузеров (кроме иногда не IE)) отобразит версию IRI в адресной строке.Такие сайты, как Википедия, используют это для получения красивых адресов.

функция преобразования не видит символ ú

Какая функция преобразования?rawurlencode() будет правильно выплевывать %C3%BA для ú, если, как вы, вероятно, и делаете, у вас это в кодировке UTF-8.Это правильный способ включения текста в компонент пути URL.(urlencode() также дает те же результаты, но его следует использовать только для компонентов запроса.)

Если вы имеете в виду htmlentities() ... do not , используйте эту функцию.Он преобразует все не-ASCII-символы в ссылки на символы HTML, что делает ваш вывод излишне большим и означает, что он должен знать, в какой кодировке находится передаваемая вами строка.Если вы не укажете аргумент UTF-8 $charset, он будет использовать ISO-8859-1 и, следовательно, испортит все ваши символы, не относящиеся к ASCII.

Если вы специально не создаете среду, в которой неСимволы ASCII, лучше использовать htmlspecialchars().Это дает меньший вывод, и не имеет значения (*), если вы забудете включить аргумент $charset, поскольку все, что он меняет, это пара символов, таких как < и &.

(На самом деле это может иметь значение для некоторых восточноазиатских многобайтовых наборов символов, где < может быть частью многобайтовой последовательности и поэтому не должно быть экранировано. Но в целом вы бы хотели избежать этих устаревших кодировок, так как UTF-8 менее ужасен.)

(даже простой str_replace() тоже не работает).

Если вы написали str_replace(..., 'ú', ...) в исходном коде PHP, вам придетсяубедитесь, что вы сохранили исходный код в той же кодировке, что и при обработке, иначе он не будет совпадать.

К сожалению, большинство текстовых редакторов Windows по-прежнему сохраняют в (ошибочно названном) «ANSI ”кодовая страница, которая зависит от локали, а не просто с использованием UTF-8.Но должно быть возможно сохранить файл как UTF-8, и тогда замена должна работать.В качестве альтернативы, напишите '\xc3\xba', чтобы избежать проблемы.

Запустите SET NAMES utf8 в базе данных перед запросом

Используйте mysql_set_charset() в предпочтении.

...