2015-06-11 19 views
0

我一直在尋找國際化的資源標識符,有一件事情讓我煩惱。punycode如何區分類似的IRI?

我的理解是,對於一個域名每個標籤(xyzzy.plugh.com有三個標籤,xyzzyplughcom),執行下面的過程把它翻譯成ASCII表示,使得它可以被所有的傳統處理好軟件:

  • 如果它僅由ASCII字符組成,則按原樣複製。
  • 否則:
    • 首先我們輸出xn--後跟所有的ASCII字符(跳過非ASCII)。
    • 然後,如果最後一個字符不是-,我們輸出-將ASCII與非ASCII分開。
    • 最後,我們使用punycode對每個非ASCII字符進行編碼,以使它們顯示爲ASCII。

我的問題,然後就是:我們如何在以下兩個Unicode URI的區別?

http://aa☃.net/ 
http://☃aa.net/ 

在我看來,那這些都將編碼爲:

http://xn--aa-nfh.net/ 

僅僅是因爲測序信息已經丟失了標籤作爲一個整體。

或者我錯過了規範中的某些東西?

回答

1

one punycode encoder,有不同的編碼:

aa☃.net -> xn--aa-gsx.net 
☃aa.net -> xn--aa-esx.net 
       ^
        see here 

relevant RFC 3492細節爲什麼是這樣的情況。首先,它在介紹中提供了線索:

唯一性:最多隻有一個基本字符串表示給定的擴展字符串。

可逆性:映射到基本字符串的任何擴展字符串都可以從該基本字符串中恢復。

這意味着必須有可微一個一對一映射爲每個單獨的基本/擴展串對。

理解它如何區分這兩種可能性需要理解解碼器(將基本字符串變成擴展的字符串,並帶有所有Unicode的榮耀)。

解碼器開始通過與僅僅是基本的字符串aa.net的指針第一a開始,然後施加一系列增量的,如gsxesx

三角洲實際編碼兩個東西。第一個是非插入數量,第二個是實際插入。

所以,gsx(在aa☃.net增量)將編碼兩個非插入隨後的插入(跳過aa)。 esx delta(對於☃aa.net)將編碼零非插入,然後插入

這就是位置編碼到基本字符串中的方式。

+0

brunesto,你的聯繫讓我做了更多的調查,結果證明你是對的。已經加入了調查的肉來充實你的答案,希望你不介意。 – paxdiablo