Юникод символы в URL - PullRequest
       37

Юникод символы в URL

130 голосов
/ 30 апреля 2010

В 2010 году вы бы обслуживали URL-адреса, содержащие символы UTF-8, на большом веб-портале?

Символы Unicode запрещены в соответствии с RFC для URL (см. здесь ). Они должны кодироваться в процентах, чтобы соответствовать стандартам.

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

Кажется, что все основные браузеры анализируют эти URL-адреса нормально, независимо от того, что говорит RFC. Мое общее впечатление, однако, состоит в том, что это становится очень шатким, оставляя домен веб-браузеров:

  • URL-адреса, копируемые + вставляемые в текстовые файлы, электронные письма и даже веб-сайты с другой кодировкой
  • Клиентские библиотеки HTTP
  • Экзотические браузеры, программы для чтения RSS

Правильно ли мне кажется, что здесь следует ожидать неприятностей, и, таким образом, это не практичное решение (пока), если вы обслуживаете нетехническую аудиторию, и важно, чтобы все ваши ссылки работали правильно, даже если они цитируются и передаются

Есть ли какой-нибудь волшебный способ предоставления привлекательных URL в HTML

http://www.example.com/düsseldorf?neighbourhood=Lörick

, которые можно копировать + вставлять с неповрежденными специальными символами, но они работают правильно при повторном использовании в старых клиентах?

Ответы [ 7 ]

118 голосов
/ 30 апреля 2010

Использовать процентное кодирование. Современные браузеры позаботятся о проблемах отображения и вставки и сделают их удобочитаемыми. Например http://ko.wikipedia.org/wiki/위키백과:대문

Редактировать: когда вы копируете такой URL в Firefox, буфер обмена будет содержать закодированную в процентах форму (что, как правило, хорошо), но если вы скопируете только часть, то остаются незашифрованными.

85 голосов
/ 30 апреля 2010

Что сказал Тгр. Справочная информация:

http://www.example.com/düsseldorf?neighbourhood=Lörick

Это не URI. Но это это и IRI .

Вы не можете включить IRI в документ HTML4; тип атрибутов, таких как href, определяется как URI, а не как IRI. В любом случае некоторые браузеры будут обрабатывать IRI, но это не очень хорошая идея.

Чтобы закодировать IRI в URI, взять части пути и запроса, кодировать их в UTF-8, а затем в процентах кодировать байты не-ASCII:

http://www.example.com/d%C3%BCsseldorf?neighbourhood=L%C3%B6rick

Если в части имени хоста IRI есть не-ASCII-символы, например. http://例え.テスト/, они были закодированы с использованием Punycode .

Теперь у вас есть URI. Это ужасный URI. Но большинство браузеров скрывают это для вас: скопируйте и вставьте его в адресную строку или перейдите по ссылке, и вы увидите, что оно отображается с оригинальными символами Юникода. Википедия использовала это в течение многих лет, например .:

http://en.wikipedia.org/wiki/ɸ

Единственный браузер, поведение которого непредсказуемо и не всегда отображает симпатичную версию IRI, это ...

... ну, вы знаете.

14 голосов
/ 30 апреля 2010

В зависимости от вашей схемы URL, вы можете сделать часть в кодировке UTF-8 "не важной". Например, если вы посмотрите на URL переполнения стека, они имеют следующую форму:

/1792027/ynikod-simvoly-v-url

Однако серверу на самом деле все равно, если вы получите деталь после неправильного идентификатора, так что это также работает:

/1792027/ynikod-simvoly-v-urlこれは、これを日本語のテキストです

Так что, если бы у вас был такой макет, вы могли бы потенциально использовать UTF-8 в части после идентификатора, и это не имело бы никакого значения, если бы оно было искажено. Конечно, это, вероятно, работает только в особых обстоятельствах ...

5 голосов

Не уверен, что это хорошая идея, но, как уже упоминалось в других комментариях, и, насколько я понимаю, многие символы Unicode действительны в URL-адресах HTML5 .

Например, href документы говорят http://www.w3.org/TR/html5/links.html#attr-hyperlink-href:

Атрибут href в элементах a и area должен иметь значение, которое является допустимым URL-адресом, потенциально окруженным пробелами.

Тогда определение «действительного URL» указывает на http://url.spec.whatwg.org/,, которое определяет кодовые точки URL как:

ASCII буквенно-цифровой, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "?", "@", "_", "~" и кодовые точки в диапазонах от U + 00A0 до U + D7FF, U + E000 до U + FDCF, U + FDF0 до U + FFFD, U + 10000 до U + 1FFFD, U + 20000 до U + 2FFFD, U + 30000 до U + 3FFFD, U + 40000 до U + 4FFFD, U + 50000 до U + 5FFFD, U + 60000 до U + 6FFFD, U + 70000 до U + 7FFFD, U + 80000 до U + 8FFFD, U + 90000 до U + 9FFFD, U + A0000 до U + AFFFD, U + B0000 до U + BFFFD, U + C0000 - U + CFFFD, U + D0000 - U + DFFFD, U + E1000 - U + EFFFD, U + F0000 - U + FFFFD, U + 100000 - U + 10FFFD.

Термин «кодовые точки URL» затем используется в нескольких частях алгоритма синтаксического анализа, например, для относительного состояния пути :

Если c - это не точка кода URL, а не "%", ошибка синтаксического анализа.

Также валидатор http://validator.w3.org/ проходит для URL-адресов, таких как "你好", и не проходит для URL-адресов с символами, такими как пробелы "a b"

4 голосов
/ 03 мая 2010

Поскольку все эти комментарии верны, вы должны отметить, что, поскольку ICANN одобрил арабские (персидские) и китайские символы для регистрации в качестве доменного имени, все компании-производители браузеров (Microsoft, Mozilla, Apple и т. Д.) Должны поддерживать Unicode в URL-адресах без какой-либо кодировки, и они должны быть доступны для поиска в Google и т. Д.

Так что эта проблема будет решена как можно скорее.

1 голос
/ 18 ноября 2015

Используйте кодированную в процентах форму . Некоторые (в основном старые) компьютеры, работающие под управлением Windows XP, например, не поддерживают Unicode, а скорее кодировки ISO. Вот почему были изобретены процентные URL-адреса. Кроме того, если вы дадите пользователю напечатанный на бумаге URL-адрес, содержащий символы, которые нелегко набрать, этому пользователю может быть сложно набрать его (или просто проигнорировать). Процентно-закодированная форма может даже использоваться на многих из самых старых машин, которые когда-либо существовали (хотя они, конечно, не поддерживают Интернет).

Однако есть и обратная сторона, поскольку символы в процентном кодировании длиннее оригинальных, что может привести к очень длинным URL-адресам. Но просто попробуйте проигнорировать это или используйте сокращатель URL (в этом случае я бы порекомендовал goo.gl , который составляет 13-символьный URL). Кроме того, если вы не хотите регистрировать учетную запись Google, попробуйте bit.ly (с помощью bit.ly URL-адреса немного длиннее, длина которых составляет 14 символов).

0 голосов
/ 03 сентября 2014

Для меня это правильный путь, это просто сработало:

    $linker = rawurldecode("$link");
    <a href="<?php echo $link;?>"   target="_blank"><?php echo $linker ;?></a>

Это сработало, и теперь ссылки отображаются корректно:

http://newspaper.annahar.com/article/121638-معرض--جوزف-حرب-في-غاليري-جانين-ربيز-لوحاته-الجدية-تبحث-وتكتشف-وتفرض-الاحترام

Ссылка найдена на:

http://www.galeriejaninerubeiz.com/newsite/news

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...