2016-05-13 103 views
2

那麼,我使用idna_convert PHP類(http://idnaconv.net/index.html)爲了編碼/解碼域名。如何檢查域是否是punycode?

不幸的是,它似乎沒有提供接口來檢查域名是否已經是punycode。

達到此目的的最佳方法是什麼?如果有人可以發佈源代碼如何驗證域是否是punycode(有解釋,因爲idna_convert代碼對我來說不是很清楚),那將會很好。我已經知道如何從idna_convert中捕捉異常。 :-)

btw .:當您嘗試將域名轉換爲已經是punycode的punycode時,idna_convert會引發異常(請參見https://github.com/phlylabs/idna-convert/blob/master/src/Punycode.php;第157行)。此外,我不太瞭解他們的支票是如何工作的。

+0

可能會嘗試php idn_to_utf8函數並將輸出與輸入進行比較? http://php.net/manual/en/function.idn-to-utf8.php –

+0

@PavelPetrov:謝謝,這個函數看起來很有趣,比捕捉異常要好得多。 :-) – Andreas

+0

@Andreas,但它可以產生錯誤的結果,因爲punycode不僅轉換爲unicode。其他,idna_convert將不需要,你知道。 – Jehy

回答

0

最簡單的方法 - 無論如何轉換它,並檢查結果是否等於輸入。

編輯:你可以用這樣的檢查擴展的Punycode類:

class PunycodeCheck extends Punycode 
{ 
    public function check_encoded($decoded) 
    { 
     $extract = self::byteLength(self::punycodePrefix); 
     $check_pref = $this->UnicodeTranscoder->utf8_ucs4array(self::punycodePrefix); 
     $check_deco = array_slice($decoded, 0, $extract); 
     if ($check_pref == $check_deco) 
      return true; 
     return false; 
    } 
} 
+0

這是一個很好的建議,但不幸的是它不起作用,因爲當域名已經是punycode並且您嘗試對其進行編碼時,idna_convert會引發異常。請參閱https://github.com/phlylabs/idna-convert/blob/master/src/Punycode.php(第157行)。 – Andreas

+0

@Andreas然後只是捕捉這個異常並檢查異常文本 - 你沒事! – Jehy

+0

是的,但我不認爲這真的是一個有效的用法......我認爲它更有意義(並且更直接)首先檢查是否需要將域編碼爲punycode或者它是否已經存在。所以我知道捕捉異常是解決問題的一種方法,但我並不喜歡這種方式...... – Andreas

0

唯一的例外是encode()方法拋出時域已Punycode的形式顯示。因此,您可以執行以下操作:

try { 
    $punycode->encode($decoded); 
} catch (\InvalidArgumentException $e) { 
    //do whatever is needed when already punycode 
    //or do nothing 
} 

但是這是一種解決方法。

+0

我同意,但在我看來,如果域名已經是punycode,那麼先檢查一下會好很多。捕獲InvalidArgumentException似乎相當....好,骯髒。 – Andreas

+0

我同意,這是解決問題的第一件事。 –

0

這取決於你想要什麼。

作爲第一個基本檢查,看域名是否只包含ASCII字符。如果是,那麼該域名「已經是punycode」,因爲它不能被進一步轉換。要檢查字符串是否只包含ASCII字符,請參閱Determine if UTF-8 text is all ASCII?

如果最重要的是,你想檢查域是否在IDN格式中,在點.處拆分域並檢查是否有任何子字符串以xn--開頭。

如果除了這一點,你要檢查如果域是IDN,是有效的,只是試圖將其與圖書館的解碼功能進行解碼。