Unicode символи в URL-адресах


135

Чи пропонували б Ви в 2010 році URL-адреси, що містять символи UTF-8, на великому веб-порталі?

Символи Unicode заборонені згідно з RFC у URL-адресах (див. Тут ). Вони повинні бути відсотково закодовані, щоб відповідати стандартам.

Моя головна думка, однак, полягає в обслуговуванні некодованих символів з єдиною метою мати красиві URL-адреси, тому відсоткове кодування вимкнено.

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

  • URL-адреси, що отримують копію + вставлені у текстові файли, електронні листи, навіть веб-сайти з іншим кодуванням
  • HTTP-бібліотеки клієнтів
  • Екзотичні браузери, RSS-зчитувачі

Чи правильно моє враження, що тут слід очікувати неприємностей, і, отже, це не практичне рішення (поки), якщо ви обслуговуєте нетехнічну аудиторію, і важливо, щоб усі ваші посилання працювали належним чином, навіть якщо вони цитуються і передаються далі?

Чи є якийсь магічний спосіб подання приємних URL-адрес у HTML

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

що можна скопіювати + вставити зі спеціальними символами неушкодженими, але правильно працювати при повторному використанні для старих клієнтів?


16
Зі свого боку, Firefox відображає символи Unicode у своєму рядку URL-адрес, але відправляє їх у кодований відсоток сервера. Крім того, коли користувач копіює URL-адресу з рядка URL-адреси, Firefox гарантує, що відсоток закодованої URL-адреси буде скопійований у буфер обміну.
Сіддхартха Редді

Відповіді:


126

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

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


Нічого, насправді ти маєш рацію! Якщо ви вирізаєте% -кодовану URL-адресу, Firefox перетворить її в правильну для відображення річ.
Дін Гардінг

Нічого собі, я цього не знала. Швидше за все, це найкраще рішення!
Pekka

33
@Dean - це доволі недавня зміна - у 2005 році всі міжнародні вікіпедії виглядали справжніми% 6D% 65% 73% 73.
Роман Старков

2
Ви в даний час можете використовувати незашифровані URL-адреси UTF-8, а саме IRI , в документах HTML5 . Якщо ви це зробите, всі основні веб-переглядачі зрозуміють це та відобразять його правильно у своєму адресному рядку.
Олівер

Які байти надсилають сучасні браузери серверам у рядку запитів GET /images/logo.png HTTP/1.1? Вони завжди відсотково кодують URL-адресу?
Flimm

87

Що сказав Тгр. Фон:

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. Але більшість браузерів приховує це для вас: скопіюйте та вставте його в адресний рядок або перейдіть за ним по посиланню, і ви побачите, що він відображається з оригінальними символами Unicode. Вікіпедія використовує це протягом багатьох років, наприклад:

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

Один браузер, поведінка якого непередбачуваний і не завжди відображає гарну версію IRI, це ...

... ну, знаєте.


31
Я знаю. Одного разу комусь належить взяти великий клуб і вдарити тих розробників Lynx по голові. Дякуємо за чудову довідкову інформацію.
Pekka

2
@bobince І один бот (швидкий вперед до 2013 року), який також не може працювати з URI-адресами без IRI, це ... ... ну, ви знаєте: bingbot! Піди розберися.
Том Гаррісон

1
Нарешті, HTML5 підтримує IRI. Більше інформації з цього питання можна знайти в цій відповіді на пов'язане питання .
Олівер

5
Re: IE не завжди показує досить IRI, вони захищають користувачів від фішингових атак на основі гомографа. Ознайомтеся з w3.org/International/articles/idn-and-iri (зокрема, розділ "Імена домену та фішинг") та blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
codingoutloud

2
Імена домену не мають нічого спільного з цим. Усі браузери забороняють широкий спектр символів, щоб запобігти фішингу. Відображення символів, що не належать до ASCII, у частині рядка шляху або запиту не створює подібної вразливості. IE просто не покладався на її реалізацію. (І Firefox - це єдиний, хто реалізував його і для частини фрагмента.)
Tgr

16

Залежно від схеми URL-адрес, ви можете зробити закодовану частину UTF-8 "не важливою". Наприклад, якщо ви переглядаєте URL-адреси переповнення стека, вони мають таку форму:

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

Однак сервер насправді не хвилює, якщо ви отримаєте деталь після ідентифікатора неправильно, тому це також працює:

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

Тож якби у вас був такий макет, тоді ви потенційно могли б використовувати UTF-8 у частині після ідентифікатора, і це не мало би значення, якщо його зіпсували. Звичайно, це, мабуть, працює лише в дещо спеціалізованих умовах ...


Хммм, дуже розумне мислення! Він по- , як і раніше може бути , що деякі клієнти не вдавитися персонажами , незалежно від того , де вони розташовані в рядку, але це було б усунути всі проблеми , пов'язані зі звичайною підтасовуванням , коли копіювання + вставка URL, який я думаю , це саме важлива частина. Ще не дивився URL-адреси SO, Дякую!
Pekka

ну, це все ще залишає слово "питання" неперекладеним, плюс є речі після хешу #, за якими слід весь URL, дуже приємний трюк, хоча !!
Євген

4
自動 翻 訳 機 を 使 っ て そ の 日本語 の URL を 作 っ た ね
Glutexo

6

Не впевнений, що це гарна ідея, але, як згадується в інших коментарях, і, як я інтерпретую це, багато символів Unicode є дійсними в URL-адресах HTML5 .

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

Атрибут href для елементів а та області повинен мати значення, яке є дійсною 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"

Пов’язано: Які символи роблять URL-адресу недійсною?


Але обидві URL-адреси ( "你好"і "a b") повинні бути закодовані у відсотках під час правильного запиту HTTP?
Утку

@Utku, "a b"я впевнений, що так, оскільки місця не в списку дозволених вище. Бо "你好"це, безумовно, краща ідея кодування відсотків, але я не знаю, чи це лише питання про те, що "реалізації недостатньо хороші" або "стандарт так говорить". Стандартний HTML, здається, дозволяє використовувати ці символи. Але я думаю, що це визначено стандартом HTTP, а не HTML. Дивіться також: stackoverflow.com/questions/912811 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

Так, я думав про стандарт HTTP, а не про HTML.
Утку

5

Оскільки всі ці коментарі є правдивими, ви повинні зауважити, що якщо ICANN затвердив арабські (персидські) та китайські символи, які повинні бути зареєстровані як Доменне ім'я, всі компанії, що створюють браузер (Microsoft, Mozilla, Apple тощо), повинні підтримка Unicode в URL-адресах без будь-якого кодування, і їх слід шукати в Google тощо.

Тож ця проблема вирішиться якнайшвидше.


2
@Nasser: Правда - у німецьких доменах зараз також є спеціальні символи - але вони закодовані в символи ASCII за допомогою Punycode . Хоча вони впевнені, що працюють у основних браузерах, пройде багато часу, перш ніж кожна бібліотека клієнтів HTTP та екзотична програма зможуть розібратися з некодованими символами Unicode.
Пекка

@ Пекка, я не впевнений, але, як я чув, усі браузери повинні підтримувати URL Unicode в 4 кварталі 2010 року (я не впевнений)
Nasser Hadjloo

Проблема ускладнюється тим, що не кожен користувацький агент - це веб-браузер. Найбільший приклад - сам Google: він не використовує звичайні веб-браузери, щоб робити це сканування. Так би багато бібліотек для взаємодії API і т.д. тощо. - URL-адреси майже буквально скрізь, а не лише у WWW. Можливо, навіть у вашій файловій системі зараз.
Корнелій

1

Використовуйте форму, закодовану у відсотках . Деякі (переважно старі) комп’ютери, на яких працює Windows XP, наприклад, не підтримують Unicode, а швидше кодування ISO. Саме тому були винайдені URL-кодовані URL-адреси. Крім того, якщо ви надаєте користувачу URL-адресу, надруковану на папері, що містить символи, які неможливо легко набрати, користувачеві може бути важко ввести його (або просто проігнорувати його). Форма, закодована у відсотках, може бути використана навіть у багатьох найстаріших машинах, що коли-небудь існували (хоча вони, звичайно, не підтримують Інтернет).

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


Чому я хочу підтримувати застарілі комп’ютери, які все ще використовують Windows XP?
Матеус Феліпе

0

Для мене це правильний шлях. Це просто працювало:

    $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


2
"посилання відображаються належним чином" - за винятком того, що аналізатор розмітки StackOverflow не інтерпретує URL-адреси за призначенням!
MrWhite
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.