Karakter unicode di URL

136

Pada tahun 2010, apakah Anda akan menyajikan URL yang berisi karakter UTF-8 di portal web besar?

Karakter unicode dilarang sesuai RFC di URL (lihat di sini ). Mereka harus persen dikodekan agar sesuai dengan standar.

Poin utama saya, bagaimanapun, adalah melayani karakter yang tidak dikodekan hanya untuk tujuan memiliki URL yang terlihat bagus, jadi encoding persen keluar.

Semua browser utama tampaknya mengurai URL tersebut dengan baik, apa pun yang dikatakan RFC. Kesan umum saya, bagaimanapun, adalah bahwa hal itu menjadi sangat goyah ketika meninggalkan domain browser web:

  • URL mendapatkan copy + paste ke file teks, E-Mail, bahkan situs Web dengan pengkodean yang berbeda
  • Perpustakaan Klien HTTP
  • Browser eksotis, pembaca RSS

Apakah kesan saya benar bahwa masalah diharapkan terjadi di sini, dan karena itu (belum) solusi praktis jika Anda melayani audiens non-teknis dan penting agar semua link Anda berfungsi dengan baik meskipun dikutip dan diteruskan?

Apakah ada cara ajaib untuk menyajikan URL yang terlihat bagus dalam HTML

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

yang dapat disalin + ditempel dengan karakter khusus yang utuh, tetapi berfungsi dengan benar saat digunakan kembali di klien lama?

Pekka
sumber
16
Untuk bagiannya, Firefox menampilkan karakter Unicode di bilah URL-nya tetapi mengirimkannya ke persentase server yang dikodekan. Selain itu, ketika pengguna menyalin URL dari bilah URL, Firefox memastikan bahwa persentase URL yang dikodekan disalin ke papan klip.
Siddhartha Reddy

Jawaban:

126

Gunakan encoding persen. Browser modern akan menangani masalah tampilan & tempel dan membuatnya dapat dibaca manusia. E. g. http://ko.wikipedia.org/wiki/ 위키 백과: 대문

Sunting: ketika Anda menyalin url seperti itu di Firefox, papan klip akan menyimpan formulir yang dikodekan persen (yang biasanya merupakan hal yang baik), tetapi jika Anda menyalin hanya sebagian saja, itu akan tetap tidak dikodekan.

Tgr
sumber
Wow, sebenarnya kamu benar! Jika Anda memotong dengan% -encoded URL Firefox akan mengubahnya menjadi hal yang benar untuk ditampilkan.
Dean Harding
Wow, saya tidak menyadarinya. Kemungkinan ini adalah solusi terbaik!
Pekka
36
@Dean itu perubahan yang cukup baru - pada tahun 2005 semua wiki internasional tampak seperti% 6D% 65% 73% 73 yang nyata.
Roman Starkov
2
Anda dapat menggunakan URL UTF-8 yang tidak dikodekan , yaitu IRI , dalam dokumen HTML5 sekarang. Jika Anda melakukan itu, semua browser utama akan memahaminya dan menampilkannya dengan benar di bilah alamat mereka.
Oliver
Byte apa yang dikirim browser modern ke server di baris permintaan GET /images/logo.png HTTP/1.1? Apakah mereka selalu persen-encode URL?
Flimm
88

Apa kata Tgr. Latar Belakang:

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

Itu bukan URI. Tapi itu adalah sebuah IRI .

Anda tidak dapat menyertakan IRI dalam dokumen HTML4; jenis atribut seperti hrefdidefinisikan sebagai URI dan bukan IRI. Beberapa browser akan menangani IRI di sini, tetapi itu bukan ide yang bagus.

Untuk mengenkode IRI menjadi URI, ambil bagian jalur dan kueri, UTF-8-encode mereka lalu persen-encode byte non-ASCII:

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

Jika ada karakter non-ASCII di bagian nama host IRI, mis. http://例え.テスト/, mereka telah dikodekan menggunakan Punycode sebagai gantinya.

Sekarang Anda memiliki URI. Itu URI yang jelek. Tetapi sebagian besar browser akan menyembunyikannya untuk Anda: salin dan tempel ke bilah alamat atau ikuti di tautan dan Anda akan melihatnya ditampilkan dengan karakter Unicode asli. Wikipedia telah menggunakan ini selama bertahun-tahun, misalnya:

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

Satu-satunya browser yang perilakunya tidak dapat diprediksi dan tidak selalu menampilkan versi IRI yang cantik adalah ...

...ya kamu tahu lah.

bobince
sumber
31
Aku tahu. Suatu hari, seseorang harus mengambil klub besar dan memukul kepala para pengembang Lynx itu. Terima kasih atas info latar belakang yang luar biasa.
Pekka
2
@bobince Dan satu-satunya bot (maju cepat ke 2013) yang juga tidak dapat menangani URI non IRI adalah ... ... yah, Anda tahu: bingbot! Sosok pergi.
Tom Harrison
1
HTML5 akhirnya mendukung IRI. Info lebih lanjut tentang subjek dapat ditemukan dalam jawaban untuk pertanyaan terkait ini .
Oliver
5
Re: IE tidak selalu menampilkan IRI yang cantik - mereka melindungi pengguna dari serangan phishing berbasis homograf. Lihat w3.org/International/articles/idn-and-iri (khususnya bagian 'Nama domain-dan phishing') dan blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
codingoutloud
2
Nama domain tidak ada hubungannya dengan ini. Semua browser melarang berbagai macam karakter untuk mencegah phishing. Menampilkan karakter non-ASCII di jalur atau bagian string kueri tidak membuat kerentanan serupa. IE sama sekali tidak repot-repot menerapkannya. (Dan Firefox adalah satu-satunya yang menerapkannya untuk bagian fragmen juga.)
Tgr
16

Bergantung pada skema URL Anda, Anda dapat membuat bagian yang dikodekan UTF-8 "tidak penting". Misalnya, jika Anda melihat URL Stack Overflow, mereka memiliki bentuk berikut:

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

Namun, server tidak benar-benar peduli jika Anda salah mendapatkan bagian setelah pengenal, jadi ini juga berfungsi:

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

Jadi jika Anda memiliki tata letak seperti ini, maka Anda berpotensi menggunakan UTF-8 di bagian setelah pengenal dan tidak masalah jika itu kacau. Tentu saja ini mungkin hanya berfungsi dalam keadaan yang agak khusus ...

Dean Harding
sumber
Hmmm, pemikiran yang sangat cerdas! Mungkin saja beberapa klien tersedak karakter di mana pun mereka berada dalam string, tetapi itu akan menghilangkan semua masalah dengan kekacauan biasa saat menyalin + menempelkan URL, yang menurut saya adalah bagian paling penting. Belum melihat URL SO seperti itu. Terima kasih!
Pekka
Nah, ini masih menyisakan kata "pertanyaan" yang tidak diterjemahkan, ditambah ada hal-hal setelah hash #, yang mengikuti seluruh url, trik yang sangat bagus !!
Evgeny
4
自動 翻 訳 機 を 使 っ て そ の 日本語 の URL を 作 っ た ね。
Glutexo
6

Karena semua komentar ini benar, Anda harus mencatat bahwa sejauh ICANN menyetujui karakter Arab (Persia) dan Cina untuk didaftarkan sebagai Nama Domain, semua perusahaan pembuat browser (Microsoft, Mozilla, Apple, dll.) Harus mendukung Unicode di URL tanpa pengkodean apa pun, dan itu harus dapat dicari oleh Google, dll.

Jadi masalah ini akan diselesaikan secepatnya.

Nasser Hadjloo
sumber
2
@Nasser: Benar - kami juga memiliki karakter khusus di domain jerman - tetapi karakter tersebut dikodekan ke dalam karakter ASCII menggunakan Punycode . Meskipun mereka pasti berfungsi di browser utama, masih lama sekali sebelum setiap pustaka klien HTTP dan aplikasi eksotis dapat menangani karakter Unicode yang tidak dikodekan.
Pekka
@Pekka, saya tidak yakin tetapi seperti yang saya dengar, semua browser harus mendukung URL Unicode pada kuartal ke-4 tahun 2010. (Saya Tidak Yakin)
Nasser Hadjloo
Masalah ini diperumit oleh fakta bahwa tidak semua agen pengguna adalah browser web. Contoh terbesar adalah google itu sendiri: Google tidak menggunakan browser web umum untuk melakukan perayapan. Begitu juga banyak perpustakaan untuk interaksi API, dll. - URL hampir secara harfiah ada di mana-mana, tidak hanya di WWW. Bahkan mungkin ada di sistem file Anda sekarang.
Kornelius
6

Tidak yakin apakah itu ide yang bagus, tetapi seperti yang disebutkan di komentar lain dan seperti yang saya tafsirkan, banyak karakter Unicode yang valid di URL HTML5 .

Misalnya, hrefdokumen mengatakan http://www.w3.org/TR/html5/links.html#attr-hyperlink-href :

Atribut href pada elemen a dan area harus memiliki nilai berupa URL valid yang berpotensi dikelilingi oleh spasi.

Kemudian definisi "URL yang valid" mengarah ke http://url.spec.whatwg.org/ , yang mendefinisikan poin kode URL sebagai:

ASCII alfanumerik, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/" , ":", ";", "=", "?", "@", "_", "~", dan titik kode dalam rentang U + 00A0 hingga U + D7FF, U + E000 hingga U + FDCF , U + FDF0 hingga U + FFFD, U + 10000 hingga U + 1FFFD, U + 20000 hingga U + 2FFFD, U + 30000 hingga U + 3FFFD, U + 40000 hingga U + 4FFFD, U + 50000 hingga U + 5FFFD, U +60000 hingga U + 6FFFD, U + 70000 hingga U + 7FFFD, U + 80000 hingga U + 8FFFD, U + 90000 hingga U + 9FFFD, U + A0000 hingga U + AFFFD, U + B0000 hingga U + BFFFD, U + C0000 hingga U + CFFFD, U + D0000 hingga U + DFFFD, U + E1000 hingga U + EFFFD, U + F0000 hingga U + FFFFD, U + 100000 hingga U + 10FFFD.

Istilah "titik kode URL" kemudian digunakan di beberapa bagian algoritme penguraian, misalnya untuk status jalur relatif :

Jika c bukan titik kode URL dan bukan "%", parse error.

Juga validator http://validator.w3.org/ memberikan akses untuk URL seperti "你好", dan tidak memberikan URL dengan karakter seperti spasi"a b"

Terkait: Karakter mana yang membuat URL tidak valid?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
Tapi kedua URL ( "你好"dan "a b") harus dienkode persen saat membuat permintaan HTTP kan?
Utku
@Utku untuk "a b"Saya cukup yakin ya karena spasi tidak ada dalam daftar yang diizinkan di atas. Karena "你好", jelas merupakan ide yang lebih baik untuk persen encode, tapi saya tidak tahu apakah itu hanya pertanyaan tentang "implementasi tidak cukup baik" atau "standar mengatakan demikian". Standar HTML tampaknya mengizinkan karakter tersebut. Tapi saya pikir ini ditentukan oleh standar HTTP, bukan HTML. Lihat juga: stackoverflow.com/questions/912811/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Ya, saya memikirkan standar HTTP, bukan HTML.
Utku
1

Gunakan formulir berenkode persen . Beberapa komputer (terutama lama) yang menjalankan Windows XP misalnya tidak mendukung Unicode, melainkan pengkodean ISO. Itulah alasan mengapa URL berenkode persen ditemukan. Selain itu, jika Anda memberikan URL yang dicetak di atas kertas kepada pengguna, berisi karakter yang tidak dapat diketik dengan mudah, pengguna tersebut mungkin akan kesulitan mengetiknya (atau mengabaikannya). Bentuk persen-encoded bahkan dapat digunakan di banyak mesin tertua yang pernah ada (meskipun mereka tidak mendukung internet tentunya).

Namun ada sisi negatifnya, karena karakter yang dikodekan persen lebih panjang dari yang asli, sehingga mungkin menghasilkan URL yang sangat panjang. Tapi coba abaikan saja, atau gunakan penyingkat URL (saya akan merekomendasikan goo.gl dalam hal ini, yang membuat URL panjang 13 karakter). Juga, jika Anda tidak ingin mendaftar untuk akun Google, coba bit.ly (bit.ly membuat URL yang sedikit lebih panjang, dengan panjang 14 karakter).

EKons
sumber
Mengapa saya ingin mendukung komputer usang yang masih menggunakan Windows XP?
Mateus Felipe
0

Bagi saya ini adalah cara yang benar, Ini baru saja berhasil:

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

Ini berfungsi, dan sekarang tautan ditampilkan dengan benar:

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

Tautan ditemukan di:

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

Peter Manoukian
sumber
2
"tautan ditampilkan dengan benar" - kecuali parser penurunan harga StackOverflow tidak menafsirkan URL sebagaimana mestinya!
MrWhite