URL'lerde Unicode karakterler


135

2010 yılında, büyük bir web portalında UTF-8 karakterleri içeren URL'ler sunacak mısınız?

URL'lerdeki RFC'ye göre Unicode karakterler yasaktır ( buraya bakın ). Standartlara uygun olmaları için yüzde olarak kodlanmış olmaları gerekir.

Benim asıl amacım, sadece güzel görünen URL'lere sahip olmak için kodlanmamış karakterlere hizmet etmek, bu nedenle kodlama yüzdesi çıktı.

RFC'nin söylediği ne olursa olsun, tüm büyük tarayıcılar bu URL'leri ayrıştırıyor gibi görünüyor. Genel izlenim olsa da, web tarayıcılarının alanından ayrılırken çok titrekleşiyor:

  • Kopyalama + metin dosyalarına, E-postalara, hatta farklı kodlamaya sahip Web sitelerine yapıştırılan URL'ler
  • HTTP İstemci kitaplıkları
  • Egzotik tarayıcılar, RSS okuyucuları

Benim izlenim burada sorun bekleneceği doğru mu ve bu yüzden teknik olmayan bir kitleye hizmet veriyorsanız (henüz) pratik bir çözüm değil ve alıntı yapılıp aktarılsa bile tüm bağlantılarınızın düzgün çalışması önemlidir?

HTML'de hoş görünümlü URL'ler sunmanın sihirli bir yolu var mı

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

özel karakterler bozulmadan kopyalanabilir + yapıştırılabilir, ancak eski istemcilerde yeniden kullanıldığında doğru şekilde çalışır?


16
Firefox, Unicode karakterlerini URL çubuğunda görüntüler, ancak kodlanan sunucu yüzdesine gönderir. Ayrıca, kullanıcı URL'yi URL çubuğundan kopyaladığında, Firefox kodlanan URL'nin yüzdesinin panoya kopyalanmasını sağlar.
Siddhartha Reddy

Yanıtlar:


126

Yüzde kodlaması kullanın. Modern tarayıcılar, görüntüleme ve yapıştırma sorunlarıyla ilgilenecek ve insan tarafından okunabilir hale getirecektir. Örneğin. http://ko.wikipedia.org/wiki/ 위키 백과: 대문

Düzenleme: Böyle bir url'yi Firefox'ta kopyaladığınızda, pano yüzde kodlu formu (genellikle iyi bir şeydir) tutacaktır, ancak yalnızca bir kısmını kopyalarsanız kodlanmamış kalır.


Vay canına, aslında haklısın! % Kodlu bir URL'yi kesip yapıştırırsanız Firefox bunu görüntüleme için doğru şeye dönüştürür.
Dean Harding

Vay canına, bunun farkında değildim. Şansı bu en iyi çözümdür!
Pekka

33
@Dean oldukça yeni bir değişiklik - 2005'te tüm uluslararası wikipedi'ler gerçek bir% 6D% 65% 73% 73 gibi görünüyordu.
Roman Starkov

2
Sen kodlanmamış UTF-8 URL'ler, yani kullanabilirsiniz IRI'leri içinde, HTML5 artık belgeler. Bunu yaparsanız, tüm büyük tarayıcılar bunu anlayacak ve adres çubuklarında doğru bir şekilde görüntüleyecektir.
Oliver

Modern tarayıcılar istek satırındaki sunuculara hangi baytları gönderir GET /images/logo.png HTTP/1.1? Her zaman URL'yi yüzde olarak kodlarlar mı?
Flimm

88

Tgr ne dedi. Arka fon:

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

Bu bir URI değil. Ama olan bir IRI .

HTML4 belgesine IRI ekleyemezsiniz; gibi özelliklerin türü hrefIRI olarak değil URI olarak tanımlanır. Bazı tarayıcılar yine de burada bir IRI işleyecek, ancak bu gerçekten iyi bir fikir değil.

Bir IRI'yi bir URI'ye kodlamak için yolu ve sorgu parçalarını alın, UTF-8 kodlayın ve ardından ASCII olmayan baytların yüzde kodlamasını yapın:

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

IRI'nin ana bilgisayar adı bölümünde ASCII olmayan karakterler varsa, ör. http://例え.テスト/, bunun yerine Punycode kullanılarak kodlandılar .

Şimdi bir URI'nız var. Bu çirkin bir URI. Ancak çoğu tarayıcı bunu sizin için gizler: kopyalayıp adres çubuğuna yapıştırın veya bir bağlantıda izleyin ve orijinal Unicode karakterleriyle görüntülendiğini göreceksiniz. Wikipedia bunu yıllardır kullanıyor, örneğin:

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

Davranışı öngörülemeyen ve her zaman güzel IRI sürümünü görüntülemeyen tek tarayıcı ...

... iyi, biliyorsun.


31
Biliyorum. Bir gün, birisi büyük bir kulüp almalı ve Lynx geliştiricilerini kafasına koymalıdır. Mükemmel arka plan bilgisi için teşekkürler.
Pekka

2
@bobince IRI olmayan URI'ları da işleyemeyen tek bot (2013'e kadar hızlı) ... ... biliyorsunuz: bingbot! Git şekil.
Tom Harrison

1
HTML5 nihayet IRI'leri destekliyor. Konuyla ilgili daha fazla bilgi, ilgili bir sorunun bu cevabında bulunabilir .
Oliver

5
Re: IE her zaman güzel IRI'ler göstermiyor - kullanıcıları homografi tabanlı kimlik avı saldırılarına karşı koruyorlar. Check out w3.org/International/articles/idn-and-iri (özellikle bölümün 'Alan adları-ve kimlik avı') ve blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
codingoutloud

2
Alan adlarının bununla hiçbir ilgisi yoktur. Kimlik avını önlemek için tüm tarayıcılar çok çeşitli karakterlere izin vermez. Yolda veya sorgu dizesi bölümünde ASCII olmayan karakterlerin görüntülenmesi benzer bir güvenlik açığı oluşturmaz. IE sadece uygulamak için uğraşmadı. (Ve Firefox, parça parçası için de uygulayan tek kişi.)
Tgr

16

URL şemanıza bağlı olarak UTF-8 kodlu parçayı "önemli değil" yapabilirsiniz. Örneğin, Yığın Taşması URL'lerine bakarsanız, bunlar aşağıdaki formdadır:

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

Ancak, sunucu, tanımlayıcıdan sonraki parçayı yanlış alıp almadığınızı umursamaz, bu nedenle de çalışır:

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

Yani böyle bir düzeniniz varsa, tanımlayıcıdan sonraki bölümde potansiyel olarak UTF-8'i kullanabilirsiniz ve bozuk olup olmadığı gerçekten önemli değildir. Tabii ki bu muhtemelen sadece biraz özel durumlarda çalışıyor ...


Hmmm, çok akıllıca düşünme! Hala bazı müşteriler hayır onlar dizede neresinde önemli karakterlere boğulmaya olması olabilir, ama bu olur ben en önemli parçası olduğunu düşünüyorum bir URL, yapıştırarak + kopyaladığınızda sıradan tahrifine ile tüm sorunları ortadan kaldırır. SO'nun URL'sine henüz bu şekilde bakmamıştı. Teşekkürler!
Pekka

iyi, bu hala kelime "soru" tercüme edilmez bırakır, artı karma #, sonra tüm url, çok güzel hile takip şeyler var !!
Evgeny

4
の 翻 訳 機 を 使 っ て そ の の の URL を 作 っ た ね。
Glutexo

6

İyi bir fikir olup olmadığından emin değilim, ancak diğer yorumlarda belirtildiği ve yorumladığım gibi, birçok Unicode karakteri HTML5 URL'lerinde geçerlidir .

Örneğin, hrefdokümanlar http://www.w3.org/TR/html5/links.html#attr-hyperlink-href diyor :

A ve alan öğelerindeki href özelliğinin, boşluklarla çevrelenmiş geçerli bir URL olan bir değere sahip olması gerekir.

Daha sonra "geçerli URL" tanımı , URL kodu noktalarını şu şekilde tanımlayan http://url.spec.whatwg.org/ adresini gösterir :

ASCII alfasayısal, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/" , ":", ";", "=", "?", "@", "_", "~" ve U + 00A0 - U + D7FF, U + E000 - U + FDCF arasındaki kod noktaları , 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.

Daha sonra "URL kod noktaları" terimi, ayrıştırma algoritmasının birkaç bölümünde, örneğin göreli yol durumu için kullanılır :

C bir URL kodu noktası değilse ve "%" değilse, ayrıştırma hatası.

Ayrıca doğrulayıcı http://validator.w3.org/ gibi URL'ler için geçer "你好"ve boşluk gibi karakterlere sahip URL'ler için geçmez"a b"

İlgili: Hangi karakterler URL'yi geçersiz kılar?


Ancak , HTTP isteği doğru yapılırken her iki URL'nin ( "你好"ve "a b") yüzde olarak kodlanması gerekir mi?
Utku

@Utku "a b"çünkü alan yukarıdaki izin verilen listede olmadığından eminim. Çünkü "你好", yüzde kodlamak kesinlikle daha iyi bir fikir, ama bunun sadece "uygulamalar yeterince iyi değil" ya da "standart böyle söylüyor" sorusu olup olmadığını bilmiyorum. HTML standardı bu karakterlere izin veriyor gibi görünüyor. Ancak bunun HTML değil HTTP standardı tarafından belirlendiğini düşünüyorum. Ayrıca bakınız: stackoverflow.com/questions/912811/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Evet, HTML'yi değil, HTTP standardını düşünüyordum.
Utku

5

Tüm bu yorumlar doğru olduğu için, ICANN onaylı Arapça (Farsça) ve Çince karakterlerin Alan Adı olarak kaydedilmesi gerektiği sürece, tarayıcı yapan tüm şirketlerin (Microsoft, Mozilla, Apple vb.) herhangi bir kodlama olmadan URL'lerde Unicode'u destekleyin ve bunlar Google vb. tarafından aranabilir olmalıdır.

Böylece bu sorun en kısa sürede çözülecektir.


2
@Nasser: Doğru - Alman dillerinde de özel karakterlerimiz var - ancak bunlar Punycode kullanılarak ASCII karakterlerine kodlandı . Büyük tarayıcılarda çalışacaklarından emin olsalar da, her HTTP istemci kitaplığı ve egzotik uygulamanın kodlanmamış Unicode karakterlerle başa çıkması uzun zaman alacaktır.
Pekka

@Pekka, emin değilim ama duyduğum gibi, tüm tarayıcıların Unicode URL'sini 2010'un 4. çeyreğinde desteklemesi gerekiyor. (Emin değilim)
Nasser Hadjloo,

Sorun, her kullanıcı aracısının bir web tarayıcısı olmaması nedeniyle karmaşıktır. En büyük örnek google'ın kendisidir: Tarama yapmak için yaygın web tarayıcıları kullanmaz. API etkileşimi vb. İçin birçok kütüphane vb. - URL'ler sadece WWW'de değil, neredeyse her yerde bulunur. Muhtemelen şu anda dosya sisteminizde bile.
Cornelius

1

Yüzde kodlu formu kullan . Örneğin Windows XP çalıştıran bazı (çoğunlukla eski) bilgisayarlar Unicode'u değil, ISO kodlamalarını destekler. Yüzde kodlamalı URL'lerin icat edilmesinin nedeni budur. Ayrıca, bir kullanıcıya kağıda basılmış, kolayca yazılamayan karakterler içeren bir URL verirseniz, söz konusu kullanıcı onu yazmakta zorlanabilir (veya yalnızca yok sayabilir). Yüzde kodlu form, var olan en eski makinelerin çoğunda bile kullanılabilir (elbette İnternet'i desteklemese de).

Yine de, yüzde kodlu karakterler orijinal karakterlerden daha uzun olduğu için bir dezavantaj var, bu yüzden muhtemelen gerçekten uzun URL'lere neden oluyor. Ancak görmezden gelmeye çalışın veya bir URL kısaltıcı kullanın ( bu durumda, 13 karakter uzunluğunda bir URL yapan goo.gl'yi öneririm ). Ayrıca, bir Google hesabına kaydolmak istemiyorsanız, bit.ly'yi (bit.ly, uzunluğu 14 karakter olacak şekilde biraz daha uzun URL'ler yapar) deneyin .


Neden hala Windows XP kullanan eski bilgisayarları desteklemek isteyeyim?
Mateus Felipe

0

Benim için bu doğru yol, Bu sadece çalıştı:

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

Bu işe yaradı ve şimdi bağlantılar düzgün bir şekilde görüntüleniyor:

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

Bağlantı bulundu:

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


2
"bağlantılar düzgün bir şekilde görüntülenir" - StackOverflow etiketleme ayrıştırıcısı URL'leri istendiği gibi yorumlamaz!
MrWhite
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.