(PHP) rawurlencode / decode, похоже, кодирует знак '£' как 'Â £' (% C2% A3 вместо% A3)

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

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

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

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


person Stephen    schedule 13.07.2010    source источник


Ответы (2)


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

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

iconv("UTF-8", "ISO-8859-15//TRANSLIT", $original)
person Artefacto    schedule 13.07.2010
comment
Итак, какой способ лучше - изменить набор символов формы - обратите внимание, что атрибут, который я нашел в w3schools, был accept-charset, а не charset - или использовать iconv в коде? Я читал, что IE явно не работает должным образом с accept-charset, так что лучше преобразовать серверную часть из UTF? - person Stephen; 13.07.2010
comment
@Stephen Вы правы, это accept-charset. Я бы сказал, что было бы лучше сделать это на стороне сервера, потому что стандарт не гарантирует, что вы все равно не получите UTF-8. А еще лучше всегда использовать UTF-8, в том числе для хранения данных в базе данных. ИМО, все новые веб-приложения должны развиваться в этом направлении. - person Artefacto; 13.07.2010
comment
@Stephen Обратите внимание, что, несмотря на то, что это стандарт, есть некоторые проблемы с реализацией, в частности, некоторые браузеры используют кодировку страницы для определения кодировки отправки, несмотря на наличие accept-charset. См. stackoverflow.com/questions/153527 - person Artefacto; 13.07.2010

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

Ответ Artefacto представляет собой случай, когда вам нужно преобразовать кодировки символов, например, вы отображаете страницу, а кодировка страницы установлена ​​на Latin-1. (Raw) Urlencode будет создавать экранированные строки с представлениями многобайтовых символов. (Необработанный) 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.

person maxwellb    schedule 13.07.2010
comment
Есть ли способ указать PHP urlencode (или, что лучше, rawurlencode, поскольку urlencode устарел) использовать другую кодировку ANSI? На странице руководства я не нашел способа для какой-либо функции. - person Stephen; 13.07.2010