(PHP) rawurlencode / decode, кажется, кодирует знак «£» как «Â £» (% C2% A3 вместо% A3) - PullRequest
4 голосов
/ 13 июля 2010

Итак, я столкнулся с проблемой с функцией rawurlencode в PHP.Все текстовые поля в нашем веб-приложении, конечно, преобразуются перед их обработкой веб-сервером, и для этого мы использовали rawurlencode.Это прекрасно работает практически со всеми найденными мною персонажами, за исключением знака «£».Теперь у наших пользователей нет причин вводить знак фунта, но они могут, поэтому я хочу позаботиться об этом.

Проблема в том, что rawurlencode не кодирует знак фунта, введенный навеб-страница как% A3, но вместо этого как% C2% A3.Еще хуже, если пользователь не смог ввести еще один бит критической информации (что приводит к обновлению веб-страницы - проверки выполняются на стороне сервера - и попытаться заполнить поля формы информацией, которую использовал пользователь), то когда% C2 запускается через rawurldecode / encode, он становится Ã?- иначе,% C3?И, конечно же, «£» также превращается в другой £!

Итак, что вызывает это?Я предполагаю, что это проблема кодировки символов, но я не настолько осведомлен об этих вещах.Я где-то слышал, что я могу кодировать £ как £ вручную, но зачем мне это делать, когда база данных может обрабатывать «£», и для знака фунта есть процентное кодирование?Это ошибка в rawurlencode или ошибка, вызванная различными наборами символов?

Спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 13 июля 2010

Стандарт требует, чтобы формы отправлялись в кодировке, указанной вами в <form accept-charset="..."> или UTF-8, если он не указан или введенный пользователем текст не может быть представлен в указанной кодировке.

Очевидно, вы получаете знак фунта, закодированный в UTF-8.Если вы хотите преобразовать его в ISO-8859-15, напишите:

iconv("UTF-8", "ISO-8859-15//TRANSLIT", $original)
2 голосов
/ 13 июля 2010

Это, вероятно, кодировка символа A3 в вашем собственном наборе символов C2A3 в кодировке UTF-8 , которая, по-видимому, является допустимой кодировкой UTF-8 для ANSI A3.Просто используйте ваш кодированный URL, используя кодировку UTF-8 , или укажите кодировку ANSI для кода urlencode.

Ответ Artefacto представляет собой случай, когда вам нужно преобразовать кодировки символов, например, вы отображаетестраница и кодировка страницы установлены на Latin-1.(Raw) Urlencode создаст экранированные строки с многобайтовыми символьными представлениями.(Raw) Urldecode по умолчанию будет генерировать строки в кодировке utf-8 и будет представлять £ как два байта.Если вы отображаете эту строку, утверждая, что это строка в кодировке ISO-8859, она будет отображаться в виде двух символов.

Учебник по PHP и UTF-8: http://www.phpwact.org/php/i18n/utf-8
Некоторые "горячие советы": http://www.sitepoint.com/blogs/2006/08/10/hot-php-utf-8-tips/

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

Используйте mb_convert_encoding , чтобы заставить PHP понять, что байты в строке представляют строку в кодировке UTF-8.

...