อักขระ Unicode ใน URL


136

ในปี 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 ที่เข้ารหัสเปอร์เซ็นต์ถูกคัดลอกไปยังคลิปบอร์ด
Siddhartha Reddy

คำตอบ:


126

ใช้การเข้ารหัสเปอร์เซ็นต์ เบราว์เซอร์สมัยใหม่จะดูแลปัญหาการแสดงและวางและทำให้มนุษย์สามารถอ่านได้ เช่น. http://ko.wikipedia.org/wiki/ 위키백과: 대문

แก้ไข:เมื่อคุณคัดลอก url ดังกล่าวใน Firefox คลิปบอร์ดจะเก็บรูปแบบที่เข้ารหัสเป็นเปอร์เซ็นต์ไว้ (ซึ่งโดยปกติจะเป็นสิ่งที่ดี) แต่ถ้าคุณคัดลอกเพียงบางส่วนของ URL นั้นจะยังคงไม่ได้เข้ารหัส


ว้าวคุณพูดถูกจริงๆ! หากคุณตัดไม่วาง URL ที่เข้ารหัส% แล้ว Firefox จะเปลี่ยนเป็น URL ที่ถูกต้องสำหรับการแสดงผล
Dean Harding

ว้าวฉันไม่รู้เรื่องนี้ โอกาสนี้เป็นทางออกที่ดีที่สุด!
Pekka

36
@Dean เป็นการเปลี่ยนแปลงล่าสุด - ในปี 2548 วิกิพีเดียระหว่างประเทศทั้งหมดดูเหมือนจริง% 6D% 65% 73% 73
Roman Starkov

2
คุณสามารถใช้ URL แบบ UTF-8 ที่ไม่ได้เข้ารหัสนั่นคือIRIในเอกสารHTML5 ได้ในตอนนี้ หากคุณทำเช่นนั้นเบราว์เซอร์หลักทั้งหมดจะเข้าใจและแสดงอย่างถูกต้องในแถบที่อยู่ของตน
Oliver

เบราว์เซอร์ที่ทันสมัยไม่ไบต์สิ่งที่ส่งไปยังไปยังเซิร์ฟเวอร์ในสายการร้องขอGET /images/logo.png HTTP/1.1? พวกเขาเข้ารหัส URL เป็นเปอร์เซ็นต์หรือไม่
Flimm

88

สิ่งที่ 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

หากมีอักขระที่ไม่ใช่ ASCII ในส่วนชื่อโฮสต์ของ IRI เช่น http://例え.テスト/พวกเขาได้รับการเข้ารหัสโดยใช้Punycodeแทน

ตอนนี้คุณมี URI แล้ว มันเป็น URI ที่น่าเกลียด แต่เบราว์เซอร์ส่วนใหญ่จะซ่อนสิ่งนั้นไว้ให้คุณ: คัดลอกและวางลงในแถบที่อยู่หรือตามลิงค์แล้วคุณจะเห็นมันแสดงด้วยอักขระ Unicode ดั้งเดิม Wikipedia ใช้สิ่งนี้มาหลายปีแล้วเช่น:

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

เบราว์เซอร์ตัวเดียวที่มีพฤติกรรมไม่สามารถคาดเดาได้และไม่ได้แสดงเวอร์ชัน IRI ที่สวยงามเสมอไปคือ ...

...ดีที่คุณรู้.


31
ฉันรู้ว่า. วันหนึ่งใครบางคนต้องเข้าร่วมสโมสรใหญ่และทุบหัวนักพัฒนา Lynx ขอบคุณสำหรับข้อมูลพื้นหลังที่ยอดเยี่ยม
Pekka

2
@bobince และบอทตัวเดียว (กรอไปข้างหน้าถึงปี 2013) ที่ไม่สามารถจัดการกับ URI ที่ไม่ใช่ IRI ได้คือ ... ... คุณก็รู้ว่า: bingbot! ไปคิด
Tom Harrison

1
HTML5 รองรับ IRI ในที่สุด ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้สามารถพบได้ในคำตอบนี้ไปคำถามที่เกี่ยวข้อง
Oliver

5
Re: IE ไม่ได้แสดง IRI ที่สวยงามเสมอไป - พวกเขากำลังปกป้องผู้ใช้จากการโจมตีแบบฟิชชิ่งแบบ homograph ดู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 "ไม่สำคัญ" ได้ ตัวอย่างเช่นหากคุณดู Stack Overflow URL จะอยู่ในรูปแบบต่อไปนี้:

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

อย่างไรก็ตามเซิร์ฟเวอร์ไม่สนใจว่าคุณได้รับส่วนหลังจากตัวระบุผิดหรือไม่ดังนั้นจึงใช้งานได้:

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

ดังนั้นหากคุณมีเค้าโครงเช่นนี้คุณอาจใช้ UTF-8 ในส่วนหลังตัวระบุได้และมันจะไม่สำคัญเลยหากมันอ่านไม่ออก แน่นอนสิ่งนี้อาจใช้ได้เฉพาะในสถานการณ์ที่ค่อนข้างเฉพาะ ...


อืมฉลาดมาก ! อาจเป็นไปได้ว่าลูกค้าบางรายสำลักอักขระไม่ว่าจะอยู่ที่ใดในสตริง แต่จะช่วยขจัดปัญหาทั้งหมดเกี่ยวกับการอ่านไม่ออกเมื่อคัดลอก + วาง URL ซึ่งฉันคิดว่าเป็นส่วนที่สำคัญที่สุด ยังไม่ได้ดู URL ของ SO ด้วยวิธีนั้น ขอบคุณ!
Pekka

นี่ยังคงปล่อยให้คำว่า "คำถาม" ไม่ได้รับการแปลแถมยังมีสิ่งที่อยู่หลังแฮช # ซึ่งเป็นไปตาม url ทั้งหมดซึ่งเป็นเคล็ดลับที่ดีมาก !!
Evgeny

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

6

เนื่องจากความคิดเห็นทั้งหมดนี้เป็นความจริงคุณควรทราบว่าเท่าที่ICANNอนุมัติให้ใช้อักษรอาหรับ (เปอร์เซีย) และอักษรจีนที่จดทะเบียนเป็นชื่อโดเมน บริษัท ที่ทำเบราว์เซอร์ทั้งหมด (Microsoft, Mozilla, Apple ฯลฯ ) จะต้อง สนับสนุน Unicode ใน URL โดยไม่ต้องเข้ารหัสใด ๆ และ Google ควรค้นหาได้เป็นต้น

ดังนั้นปัญหานี้จะแก้ไขโดยเร็วที่สุด


2
@Nasser: ทรู - เรามีตัวอักษรพิเศษในโดเมนเยอรมันตอนนี้เกินไป - แต่เหล่านั้นจะถูกเข้ารหัสเป็นอักขระ ASCII ใช้punycode แม้ว่าพวกเขาจะทำงานในเบราว์เซอร์หลัก ๆ แต่ก็ต้องใช้เวลานานก่อนที่ไลบรารีไคลเอ็นต์ HTTP และแอปพลิเคชันแปลกใหม่ทุกตัวจะสามารถจัดการกับอักขระ Unicode ที่ไม่ได้เข้ารหัสได้
Pekka

@Pekka ฉันไม่แน่ใจ แต่อย่างที่ฉันได้ยินเบราว์เซอร์ทั้งหมดต้องรองรับ Unicode URL ในไตรมาสที่ 4 ของปี 2010 (ฉันไม่แน่ใจ)
Nasser Hadjloo

ปัญหามีความซับซ้อนเนื่องจากตัวแทนผู้ใช้ไม่ใช่ทุกคนที่เป็นเว็บเบราว์เซอร์ ตัวอย่างที่ใหญ่ที่สุดคือ Google เอง: ไม่ใช้เว็บเบราว์เซอร์ทั่วไปในการรวบรวมข้อมูล ไลบรารีจำนวนมากสำหรับการโต้ตอบกับ API ฯลฯ เป็นต้น - URL มีอยู่เกือบทุกที่ไม่ใช่เฉพาะใน WWW อาจเป็นได้ในระบบไฟล์ของคุณในขณะนี้
Cornelius

6

ถ้าไม่แน่ใจว่ามันเป็นความคิดที่ดี แต่เป็นที่กล่าวถึงในความคิดเห็นอื่น ๆ และที่ผมตีความว่าตัวอักษร Unicode หลายที่ถูกต้องใน HTML5 URL ที่

เช่นhrefเอกสารพูดว่าhttp://www.w3.org/TR/html5/links.html#attr-hyperlink-href :

แอตทริบิวต์ href บนองค์ประกอบ a และพื้นที่ต้องมีค่าซึ่งเป็น 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

@Utku สำหรับ"a b"ฉันค่อนข้างแน่ใจว่าใช่เนื่องจากช่องว่างไม่อยู่ในรายการที่อนุญาตด้านบน เพราะ"你好"มันเป็นความคิดที่ดีกว่าในการเข้ารหัสเปอร์เซ็นต์ แต่ฉันไม่รู้ว่าเป็นเพียงคำถามที่ว่า "การใช้งานไม่ดีพอ" หรือ "มาตรฐานบอกอย่างนั้น" มาตรฐาน HTML ดูเหมือนจะอนุญาตให้ใช้อักขระเหล่านั้น แต่ฉันคิดว่าสิ่งนี้ระบุโดยมาตรฐาน HTTP ไม่ใช่ HTML ดูเพิ่มเติม: stackoverflow.com/questions/912811/…
Ciro Santilli 郝海东郝海东冠状病事件事件

ใช่ฉันกำลังคิดถึงมาตรฐาน HTTP ไม่ใช่ HTML
Utku

1

ใช้รูปแบบร้อยละเข้ารหัส คอมพิวเตอร์บางเครื่อง (ส่วนใหญ่เก่า) ที่ใช้ Windows XP ไม่รองรับ Unicode แต่ใช้การเข้ารหัส ISO นั่นคือเหตุผลที่มีการคิดค้น URL ที่เข้ารหัสเปอร์เซ็นต์ นอกจากนี้หากคุณให้ URL ที่พิมพ์บนกระดาษแก่ผู้ใช้ซึ่งมีอักขระที่ไม่สามารถพิมพ์ได้อย่างง่ายดายผู้ใช้รายนั้นอาจมีปัญหาในการพิมพ์ (หรือเพิกเฉย) รูปแบบที่เข้ารหัสเป็นเปอร์เซ็นต์สามารถใช้ได้กับเครื่องที่เก่าแก่ที่สุดที่เคยมีมา (แม้ว่าจะไม่รองรับอินเทอร์เน็ตก็ตาม)

แม้ว่าจะมีข้อเสียเนื่องจากอักขระที่เข้ารหัสเป็นเปอร์เซ็นต์นั้นยาวกว่าอักขระดั้งเดิมจึงอาจส่งผลให้ URL ยาวมาก แต่เพียงแค่พยายามเพิกเฉยหรือใช้ตัวย่อ URL (ฉันขอแนะนำgoo.glในกรณีนี้ซึ่งทำให้ URL ยาว 13 อักขระ) นอกจากนี้หากคุณไม่ต้องการลงทะเบียนบัญชี Google ลองใช้bit.ly (bit.ly สร้าง URL ที่ยาวขึ้นเล็กน้อยโดยมีความยาว 14 อักขระ)


เหตุใดฉันจึงต้องการสนับสนุนคอมพิวเตอร์ที่ล้าสมัยที่ยังใช้ Windows XP
Mateus Felipe

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.