No nie mogę. Ex aequo dzisiejszą nagrodę otrzymuje również zespół dinfo.pl. Jako ich partner, jesteśmy zmuszeni do korzystania z ich API do wykonywania wszelkich operacji na domenach. Właśnie wpisałem o-umlaut do formularza wyszukiwania domen i system zmarł z komunikatem zły assert
. Szukałem błędu po swojej stronie, ale ich serwis okazywał się reagować tak samo. Zajrzałem przeto w otchłań bezdenną i wydobyłem z jej czeluści kod ichniej implementacji punycode, czyli systemu tłumaczenia nazw domen na obowiązujący standard IDN:
function punycode($tryb,$tekst) { //tryby: "Encode"/"Decode" $iso = array(177,230,234,179,241,243,182,188,191, 161,198,202,163,209,211,166,172,175); $uni = array(261,263,281,322,324,243,347,378,380,260, 262,280,321,323,211,346,377,379); $tekst = iconv('utf-8', 'iso-8859-2', $tekst); $print_ascii ="\n\n\n\n\n\n\n\n\n\n\n\n\n\n". "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n !\"". "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK". "LMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrs" "tuvwxyz{|}~\n"; $domenatab=explode(".",$tekst); //podzial domeny na tablice(rozdzial z kropek) if ($tryb=="Encode") { $output=""; for ($l=0;$l<count($domenatab);$l++){ //licznik slow miedzy kropkami $tekstuni=array(); $tekst=$domenatab[$l]; $polskieznaczki=false; for ($i=0;$i<strlen($tekst);$i++) { $znaleziony=0; for ($j=0;$j<count($iso);$j++) { if (ord($tekst[$i])==$iso[$j]) { $tekstuni[$i]=$uni[$j]; $znaleziony=1; $polskieznaczki=true; break; } } if ($znaleziony==0) { $tekstuni[$i]=ord($tekst[$i]); } } // Encode: // if ($polskieznaczki==true) { $output .= "xn--". $this->punycode_encode(count($tekstuni), $tekstuni); } else { $output.=$domenatab[$l]; } if ($l!=count($domenatab)-1) { $output.="."; } } //for l=0.... $output_length=strlen($output); // Convert to native charset and output: // for ($j = 0; $j < $output_length; ++$j) { $c = ord($output[$j]); if ($c >= 0 && $c <= 127 && isset($c)) { if (ord($print_ascii[$c]) == 0) { echo "invalid_input"; } $output[$j] = $print_ascii[$c]; } else { echo "zly assert (246)"; exit; } } return str_replace("\r","",$output); } // [..] }
Przejrzyściej napisanego kodu nie napisałem, mimo wszystko udało mi się dostrzec, że:
- system potrafi obsługiwać tylko domeny podane w Latin2
- ma na sztywno wpisanych kilka polskich znaków (pierwsze dwie tablice), a inne skrupulatnie olewa
- nie ma nic wspólnego z oryginalnym algorytmem punycode (tej części nie wklejałem), którego implementację w PHP na licencji GPL można wygooglać w 10 sekund
- prześlicznie obsługuje błędy, nie ma to jak zabić skrypt w przypadku wprowadzenia nieobsługiwanych znaków do formularza