Преобразование текста UTF8 для использования в URL-адресе

Я разрабатываю международный сайт, который использует UTF8 для отображения неанглийских символов. Я также использую дружественные URLS, которые содержат имя элемента. Очевидно, что я не могу использовать неанглийские символы в URL-адресе.

Существует ли какая-то обычная практика для этого преобразования? Я не уверен, какие английские символы я должен заменить. Некоторые из них совершенно очевидны (например, от e до e), но другие персонажи, с которыми я не знаком (например, ß).

Обычно я использую iconv () с опцией «ASCII // TRANSLIT». Это требует ввода:

 último año 

и производит выходные данные:

 'ultimo a~no 

Затем я использую preg_replace (), чтобы заменить пробелы тире:

 'ultimo-a~no 

… и удалить ненужные символы, например

 [^a-z0-9-] 

Это, вероятно, бесполезно с арабским или китайским, но отлично работает с испанским, французским или немецким.

Вы можете использовать кодированные данные UTF-8 в URL-адресах. Вам просто нужно закодировать его дополнительно с помощью кодировки Percent (см. rawurlencode ):

 // ß (U+00DF) = 0xC39F (UTF-8) $str = "\xC3\x9F"; echo '<a href="http://en.wikipedia.org/wiki/'.rawurlencode($str).'">'.$str.'</a>'; 

Это будет означать ссылку на http://en.wikipedia.org/wiki/&#xDF; . Современные браузеры будут отображать сам символ ß в строке местоположения вместо процентного кодированного представления этого символа в UTF-8 ( %C3%9F ).

Если вы не хотите использовать UTF-8, но только символы ASCII, я предлагаю использовать транслитерацию, например, предложенную Álvaro G. Vicario.

Очевидно, что я не могу использовать неанглийские символы в URL-адресе.

На самом деле, вы можете . Программное обеспечение Wikipedia (встроенное в PHP) поддерживает это, например en.wikipedia.org/wiki/☃ .

Обратите внимание, что вам необходимо правильно закодировать URL-адрес, как показано в других ответах.

Используйте rawurlencode для кодирования имени для URL-адреса и rawurldecode для преобразования имени в URL-адрес обратно в исходную строку. Эти две функции преобразуют строки в URL-адреса и из них в соответствии с RFC 1738 .

В прошлый раз, когда я пытался (примерно неделю назад), символы UTF-8 (в частности, японцы) отлично работали в URL-адресах без какой-либо дополнительной кодировки. Даже посмотрел прямо в адресных барах во всех браузерах, которые я тестировал (Safari, Chrome и Firefox, все на Mac), и я понятия не имею, какой браузер моя девушка использовала на окнах. Помимо большинства окон, которые я просматривал, просто показываю квадраты для японских персонажей, потому что им не хватает требуемых шрифтов для их отображения, кажется, что там тоже хорошо работает.

URL, который я пробовал, это: http://www.webghoul.de.private-void.net/cache/black-f-with- あ い -50.png ( похоже, что ОМУ это нравится)

Доказательство скриншотом http://img.ruphp.com/php/screenshot-utf8-url.png

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

Я бы на самом деле не рекомендовал использовать эти типы символов в URL-адресах, но я также не стал бы первоочередной задачей «исправить».