• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/punycode.php
  • Класс: CBXPunycode
  • Вызов: CBXPunycode::DoEncodeUcs4
private function DoEncodeUcs4($input)
{
	$inputLength = count($input);
	if (!$inputLength)
		return false;

	$codeCount = 0;
	$result = [];

	for ($i = 0; $i < $inputLength; $i++)
	{
		$char = $input[$i];
		if (($char > 0x2F && $char < 0x40)
		    || ($char > 0x40 && $char < 0x5B)
			|| ($char > 0x60 && $char <= 0x7B)
		    || ($char == 0x2D))
		{
			$result[] = $char;
			$codeCount++;
		}
	}
	if ($codeCount == $inputLength)
		return $result;

	$result = array_merge(self::$prefixUcs4, $result);

	if ($codeCount)
		$result = array_merge($result, self::$hyphenUcs4);

	$isFirst = true;
	$currentCode = 0x80;
	$bias = 72;
	$delta = 0;
	while ($codeCount < $inputLength)
	{
		for ($i = 0, $nextCode = 0x10FFFF; $i < $inputLength; $i++)
		{
			if ($input[$i] >= $currentCode && $input[$i] <= $nextCode)
				$nextCode = $input[$i];
		}
		$delta += ($nextCode - $currentCode) * ($codeCount + 1);
		$currentCode = $nextCode;

		for ($i = 0; $i < $inputLength; $i++)
		{
			if ($input[$i] < $currentCode)
			{
				$delta++;
			}
			elseif ($input[$i] == $currentCode)
			{
				for ($q = $delta, $k = 36; 1; $k += 36)
				{
					$t = ($k <= $bias) ? 1 : (($k >= $bias + 26) ? 26 : $k - $bias);
					if ($q < $t)
						break;
					$d = $t + (($q - $t) % (36 - $t));
					$result[] = $d + 22 + 75 * ($d < 26);
					$q = (int) (($q - $t) / (36 - $t));
				}
				$result[] = $q + 22 + 75 * ($q < 26);
				$bias = $this->Adapt($delta, $codeCount + 1, $isFirst);
				$codeCount++;
				$delta = 0;
				$isFirst = false;
			}
		}
		$delta++;
		$currentCode++;
	}
	return $result;
}