Юникод-символы в URL-адресах

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

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

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

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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,...

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

Ответ 3

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

http://stackoverflow.com/questions/2742852/unicode-characters-in-urls

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

http://stackoverflow.com/questions/2742852/これは、これを日本語のテキストです

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

Ответ 4

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

Например, href docs say http://www.w3.org/TR/html5/links.html#attr-hyperlink-href:

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

Тогда определение "действительный URL" указывает на http://url.spec.whatwg.org/, который определяет URL-коды 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"

Ответ 5

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

Таким образом, эта проблема будет устранена как можно скорее.

Ответ 6

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

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

Ответ 7

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

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

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

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

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

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