%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/bookmarks/vendor/rowbot/idna/src/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/bookmarks/vendor/rowbot/idna/src/CodePoint.php |
<?php declare(strict_types=1); namespace Rowbot\Idna; use function chr; use function ord; use function strlen; final class CodePoint { /** * Takes a Unicode code point and encodes it. The return behavior is undefined if the given * code point is outside the range 0..10FFFF. * * @see https://encoding.spec.whatwg.org/#utf-8-encoder */ public static function encode(int $codePoint): string { if ($codePoint >= 0x00 && $codePoint <= 0x7F) { return chr($codePoint); } $count = 0; $offset = 0; if ($codePoint >= 0x0080 && $codePoint <= 0x07FF) { $count = 1; $offset = 0xC0; } elseif ($codePoint >= 0x0800 && $codePoint <= 0xFFFF) { $count = 2; $offset = 0xE0; } elseif ($codePoint >= 0x10000 && $codePoint <= 0x10FFFF) { $count = 3; $offset = 0xF0; } $bytes = chr(($codePoint >> (6 * $count)) + $offset); while ($count > 0) { $temp = $codePoint >> (6 * ($count - 1)); $bytes .= chr(0x80 | ($temp & 0x3F)); --$count; } return $bytes; } /** * Takes a UTF-8 encoded string and converts it into a series of integer code points. Any * invalid byte sequences will be replaced by a U+FFFD replacement code point. * * @see https://encoding.spec.whatwg.org/#utf-8-decoder * * @return list<int> */ public static function utf8Decode(string $input): array { $bytesSeen = 0; $bytesNeeded = 0; $lowerBoundary = 0x80; $upperBoundary = 0xBF; $codePoint = 0; $codePoints = []; $length = strlen($input); for ($i = 0; $i < $length; ++$i) { $byte = ord($input[$i]); if ($bytesNeeded === 0) { if ($byte >= 0x00 && $byte <= 0x7F) { $codePoints[] = $byte; continue; } if ($byte >= 0xC2 && $byte <= 0xDF) { $bytesNeeded = 1; $codePoint = $byte & 0x1F; } elseif ($byte >= 0xE0 && $byte <= 0xEF) { if ($byte === 0xE0) { $lowerBoundary = 0xA0; } elseif ($byte === 0xED) { $upperBoundary = 0x9F; } $bytesNeeded = 2; $codePoint = $byte & 0xF; } elseif ($byte >= 0xF0 && $byte <= 0xF4) { if ($byte === 0xF0) { $lowerBoundary = 0x90; } elseif ($byte === 0xF4) { $upperBoundary = 0x8F; } $bytesNeeded = 3; $codePoint = $byte & 0x7; } else { $codePoints[] = 0xFFFD; } continue; } if ($byte < $lowerBoundary || $byte > $upperBoundary) { $codePoint = 0; $bytesNeeded = 0; $bytesSeen = 0; $lowerBoundary = 0x80; $upperBoundary = 0xBF; --$i; $codePoints[] = 0xFFFD; continue; } $lowerBoundary = 0x80; $upperBoundary = 0xBF; $codePoint = ($codePoint << 6) | ($byte & 0x3F); if (++$bytesSeen !== $bytesNeeded) { continue; } $codePoints[] = $codePoint; $codePoint = 0; $bytesNeeded = 0; $bytesSeen = 0; } // String unexpectedly ended, so append a U+FFFD code point. if ($bytesNeeded !== 0) { $codePoints[] = 0xFFFD; } return $codePoints; } }