72 if (self::$isMbStringOverload ===
null) {
73 self::$isMbStringOverload = (extension_loaded(
'mbstring') && (ini_get(
'mbstring.func_overload') & 0x02) === 0x02);
97 if (strpos($encoded, self::punycodePrefix) !== 0) {
101 if (strlen(trim($encoded)) <= strlen(self::punycodePrefix)) {
120 $delim_pos = strrpos($encoded,
'-');
121 if ($delim_pos > self::byteLength(self::punycodePrefix)) {
122 for ($k = self::byteLength(self::punycodePrefix); $k < $delim_pos; ++$k) {
123 $decoded[] = ord($encoded{$k});
126 $deco_len = count($decoded);
135 for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
136 for ($old_idx = $idx, $w = 1, $k = self::base; 1; $k +=
self::base) {
139 $t = ($k <= $bias) ? self::tMin :
140 (($k >= $bias + self::tMax) ?
self::tMax : ($k - $bias));
144 $w = (int)($w * (self::base - $t));
146 $bias = $this->
adapt($idx - $old_idx, $deco_len + 1, $is_first);
148 $char += (int)($idx / ($deco_len + 1));
149 $idx %= ($deco_len + 1);
152 for ($i = $deco_len; $i > $idx; $i--) {
153 $decoded[$i] = $decoded[($i - 1)];
156 $decoded[$idx++] = $char;
171 $check_deco = array_slice($decoded, 0, $extract);
173 if ($check_pref == $check_deco) {
174 throw new \InvalidArgumentException(
'This is already a Punycode string');
178 foreach ($decoded as $k => $v) {
189 if (!$decoded || !is_array($decoded)) {
192 $deco_len = count($decoded);
199 for ($i = 0; $i < $deco_len; ++$i) {
200 $test = $decoded[$i];
202 if ((0x2F < $test && $test < 0x40)
203 || (0x40 < $test && $test < 0x5B)
204 || (0x60 < $test && $test <= 0x7B)
205 || (0x2D == $test)) {
206 $encoded .= chr($decoded[$i]);
210 if ($codecount == $deco_len) {
214 $encoded = self::punycodePrefix . $encoded;
224 while ($codecount < $deco_len) {
227 for ($i = 0, $next_code = self::maxUcs; $i < $deco_len; $i++) {
228 if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
229 $next_code = $decoded[$i];
232 $delta += ($next_code - $cur_code) * ($codecount + 1);
233 $cur_code = $next_code;
236 for ($i = 0; $i < $deco_len; $i++) {
237 if ($decoded[$i] < $cur_code) {
239 } elseif ($decoded[$i] == $cur_code) {
240 for ($q = $delta, $k = self::base; 1; $k +=
self::base) {
243 : (($k >= $bias + self::tMax) ?
self::tMax : $k - $bias);
248 $encoded .= $this->
encodeDigit(intval($t + (($q - $t) % (self::base - $t))));
249 $q = (int)(($q - $t) / (self::base - $t));
252 $bias = $this->
adapt($delta, $codecount + 1, $is_first);
271 protected function adapt($delta, $npoints, $is_first)
273 $delta = intval($is_first ? ($delta / self::damp) : ($delta / 2));
274 $delta += intval($delta / $npoints);
276 $delta = intval($delta / (self::base - self::tMin));
278 return intval($k + (self::base - self::tMin + 1) * $delta / ($delta + self::skew));
288 return chr($d + 22 + 75 * ($d < 26));
326 foreach ($input as $v) {
333 throw new \InvalidArgumentException(sprintf(
'NAMEPREP: Prohibited input U+%08X', $v));
336 if ($range[0] <= $v && $v <= $range[1]) {
337 throw new \InvalidArgumentException(sprintf(
'NAMEPREP: Prohibited input U+%08X', $v));
341 if (0xAC00 <= $v && $v <= 0xD7AF) {
362 for ($i = 0; $i < $out_len; ++$i) {
364 if ((!$last_class || $last_class > $class) && $class) {
366 $seq_len = $i - $last_starter;
372 if (count($out) != $seq_len) {
373 for ($j = $i + 1; $j < $out_len; ++$j) {
389 $last_class = $class;
402 $sindex = (int)$char - self::sBase;
403 if ($sindex < 0 || $sindex >= self::sCount) {
407 $result[] = (int)self::lBase + $sindex / self::nCount;
408 $result[] = (int)self::vBase + ($sindex % self::nCount) /
self::tCount;
409 $T = intval(self::tBase + $sindex % self::tCount);
410 if ($T != self::tBase) {
424 $inp_len = count($input);
429 $last = (int)$input[0];
432 for ($i = 1; $i < $inp_len; ++$i) {
433 $char = (int)$input[$i];
439 if (0 <= $sindex && $sindex < self::sCount && ($sindex % self::tCount == 0) && 0 <= $tindex && $tindex <=
self::tCount) {
442 $result[(count($result) - 1)] = $last;
446 if (0 <= $lindex && $lindex < self::lCount && 0 <= $vindex && $vindex < self::vCount) {
448 $last = (int)self::sBase + ($lindex * self::vCount + $vindex) *
self::tCount;
449 $result[(count($result) - 1)] = $last;
466 return isset($this->
NamePrepData->normalizeCombiningClasses[$char])
479 $size = count($input);
483 for ($i = 0; $i < $size - 1; ++$i) {
485 if ($next != 0 && $last > $next) {
487 for ($j = $i + 1; $j > 0; --$j) {
491 $t = intval($input[$j]);
492 $input[$j] = intval($input[$j - 1]);
512 $inp_len = count($input);
516 foreach ($this->
NamePrepData->replaceMaps as $np_src => $np_target) {
517 if ($np_target[0] != $input[0]) {
520 if (count($np_target) != $inp_len) {
524 foreach ($input as $k2 => $v2) {
525 if ($v2 == $np_target[$k2]) {
548 if (self::$isMbStringOverload) {
549 return mb_strlen($string,
'8bit');
551 return strlen((binary)$string);