. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Encodings; use function chr; use function intdiv; use function ord; use function str_split; /** * Convert between UTF-16LE and UTF-8. */ class UTF16LE extends AbstractUTF16Encoding { public const NAME = 'UTF-16LE'; public const BYTE_ORDER_MARK = "\xFF\xFE"; public const REPLACEMENT_CHARACTER = "\xFD\xFF"; /** * Convert two bytes to a code-point, taking care of byte-order. * * @param string $character * * @return int */ protected function characterToCodePoint(string $character): int { return ord($character[0]) + 256 * ord($character[1]); } /** * Convert a code-point to two bytes, taking care of byte-order. * * @param int $code_point * * @return string */ protected function codePointToCharacter(int $code_point): string { if ($code_point >= 0xD800 && $code_point <= 0xDFFF) { return self::REPLACEMENT_CHARACTER; } return chr($code_point % 256) . chr(intdiv($code_point, 256)); } }