Я знаю нестандартную схему% uxxxx, но это не кажется разумным выбором, так как схема была отклонена W3C.
Несколько интересных примеров:
Сердечный персонаж. Если я введу это в свой браузер:
http://www.google.com/search?q=♥
Затем скопируйте и вставьте его, я вижу этот URL
http://www.google.com/search?q=%E2%99%A5
что заставляет думать, что Firefox (или Safari) делает это.
urllib.quote_plus(x.encode("latin-1"))
'%E2%99%A5'
что имеет смысл, за исключением вещей, которые нельзя закодировать в Latin-1, например символа тройной точки.
…
Если я наберу URL
http://www.google.com/search?q=…
в свой браузер, затем скопируйте и вставьте, я получаю
http://www.google.com/search?q=%E2%80%A6
назад. Кажется, это результат выполнения
urllib.quote_plus(x.encode("utf-8"))
что имеет смысл, поскольку ... не может быть закодирован с помощью Latin-1.
Но тогда мне непонятно, как браузер знает, следует ли декодировать с помощью UTF-8 или Latin-1.
Поскольку это кажется неоднозначным:
In [67]: u"…".encode('utf-8').decode('latin-1')
Out[67]: u'\xc3\xa2\xc2\x80\xc2\xa6'
работает, поэтому я не знаю, как браузер определяет, декодировать ли это с помощью UTF-8 или Latin-1.
Как правильно поступать со специальными символами, с которыми мне нужно иметь дело?
источник
Ответы:
Я всегда кодировал в UTF-8. Со страницы Википедии о процентном кодировании :
Похоже, что из-за того, что в прошлом были другие общепринятые способы кодирования URL-адресов, браузеры пытаются использовать несколько методов декодирования URI, но если вы тот, кто выполняет кодирование, вам следует использовать UTF-8.
источник
Общее правило, по-видимому, заключается в том, что браузеры кодируют ответы формы в соответствии с типом содержимого страницы, с которой была отправлена форма. Это предположение, что если сервер отправит нам «text / xml; charset = iso-8859-1», то они ожидают ответов в том же формате.
Если вы просто вводите URL-адрес в строке URL-адреса, тогда у браузера нет базовой страницы для работы, и поэтому ему нужно только угадывать. Таким образом, в этом случае кажется, что он все время выполняет utf-8 (поскольку оба ваших ввода производили трехоктетные значения формы).
Печальная правда заключается в том, что AFAIK не существует стандарта для набора символов, значения в строке запроса, или действительно любые символы в URL, должны интерпретироваться как. По крайней мере , в случае значений в строке запроса, нет никаких оснований предполагать , что они обязательно делать , соответствуют персонажам.
Известная проблема заключается в том, что вы должны сообщить своей серверной платформе, какой набор символов вы ожидаете, что строка запроса будет закодирована как --- например, в Tomcat вы должны вызвать request.setEncoding () (или другой аналогичный метод), прежде чем вы вызвать любой из методов request.getParameter (). Нехватка документации по этому вопросу, вероятно, отражает недостаточную осведомленность о проблеме среди многих разработчиков. (Я регулярно спрашиваю собеседников Java, в чем разница между Reader и InputStream, и регулярно получаю пустые взгляды)
источник
IRI ( RFC 3987 ) - это последний стандарт, заменяющий стандарты URI / URL ( RFC 3986 и старше). URI / URL-адреса изначально не поддерживают Unicode (ну, RFC 3986 добавляет положения для будущих протоколов на основе URI / URL-адресов для его поддержки, но не обновляет предыдущие RFC). Схема "% uXXXX" является нестандартным расширением, позволяющим использовать Unicode в некоторых ситуациях, но не всеми реализована повсеместно. IRI, с другой стороны, полностью поддерживает Unicode и требует, чтобы текст был закодирован как UTF-8 перед его процентным кодированием.
источник
IRI не заменяют URI, потому что только URI (фактически, ASCII) допустимы в некоторых контекстах, включая HTTP.
Вместо этого вы указываете IRI, и он преобразуется в URI при подключении к сети.
источник
Первый вопрос: что вам нужно? Кодировка UTF-8 - это довольно хороший компромисс между взятием текста, созданного с помощью дешевого редактора, и поддержкой большого количества языков. Что касается браузера, определяющего кодировку, ответ (от веб-сервера) должен сообщить браузеру кодировку. Тем не менее, большинство браузеров будут пытаться угадать, потому что во многих случаях это либо отсутствует, либо неверно. Они предполагают, читая некоторый объем потока результатов, чтобы увидеть, есть ли символ, который не подходит для кодировки по умолчанию. В настоящее время все браузеры (? Я не проверял это, но это довольно близко к истине) по умолчанию использует utf-8.
Поэтому используйте utf-8, если у вас нет веских причин использовать одну из многих других схем кодирования.
источник