2

さて、ドメイン名をエンコード/デコードするために、idna_convert PHP クラス ( http://idnaconv.net/index.html ) を使用します。

残念ながら、ドメイン名がすでにpunycodeかどうかをチェックするインターフェースを提供していないようです。

これを達成するための最良の方法は何ですか?ドメインが punycode であるかどうかを確認する方法のソース コードを誰かが投稿できればいいと思います (idna_convert コードは私にはあまり明確ではないため、説明付きで)。idna_convert から例外をキャッチする方法は既に知っています。:-)

ところで: idna_convert は、既に punycode であるドメイン名を punycode に変換しようとすると例外をスローします ( https://github.com/phlylabs/idna-convert/blob/master/src/Punycode.php ; 157 行目を参照)。 . さらに、彼らのチェックがどのように機能するのかよくわかりません。

4

4 に答える 4

1

最も簡単な方法は、とにかく変換​​して、結果が入力と等しいかどうかを確認することです。

編集: 次のようなチェックで 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;
   }
}
于 2016-05-13T12:05:02.960 に答える
0

メソッドがスローする唯一の例外encode()は、ドメインが既に punycode である場合です。したがって、次のことができます。

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

ただし、これは回避策です。

于 2016-05-13T12:19:57.513 に答える