Скажем, я хотел напечатать ÿ
(латинский маленький y с диарезисом) из его номера Unicode / UTF-8 U+00FF
или hex c3 bf
. Как я могу это сделать в PHP?
Причина в том, что мне нужно иметь возможность создавать определенные символы UTF-8 для тестирования в моих регулярных выражениях и строковых функциях. Однако, поскольку у меня на клавиатуре меньше 200 клавиш, я не могу их вводить, и, поскольку я много раз застрял в мире ASCII, мне нужно создать их базы исключительно из их безопасного ASCII , UTF- 8 символов.
Примечание. Для правильного отображения в браузере я знаю, что первый шаг
header('Content-Type: text/html; charset=utf-8');
хорошо, у вас есть все, что вам нужно.
Значения шестнадцатеричных значений также распознаются в двойных кавычках
echo "\xc3\xbf";
Решение 1 с небольшой функцией пакета
<?php function chr_utf8($n,$f='C*'){ return $n<(1<<7)?chr($n):($n<1<<11?pack($f,192|$n>>6,1<<7|191&$n): ($n<(1<<16)?pack($f,224|$n>>12,1<<7|63&$n>>6,1<<7|63&$n): ($n<(1<<20|1<<16)?pack($f,240|$n>>18,1<<7|63&$n>>12,1<<7|63&$n>>6,1<<7|63&$n):''))); } echo chr_utf8(9405).chr_utf8(9402).chr_utf8(9409).chr_utf8(9409).chr_utf8(9412); //Output ⒽⒺⓁⓁⓄ
Проверьте это в https://eval.in/748062 …
Решение 2 с json_decode
<?php $utf8_char='["'; for($number=0;$number<55296;$number++) $utf8_char.='\u'.substr('000'.strtoupper(dechex($number)),-4).'","'; $utf8_char=json_decode(substr($utf8_char,0,-2).']'); echo $utf8_char[9405].$utf8_char[9402].$utf8_char[9409].$utf8_char[9409].$utf8_char[9412]; //Output ⒽⒺⓁⓁⓄ
PHP отстой в Unicode. utf8_encode () преобразует только из ISO-8859-1 в UTF-8. И поскольку ваш символ ÿ = «U + 00FF» является одним из первых 256 кодовых точек в Юникоде (U + 0000 до U + 00FF), и поскольку Unicode решил, что этот диапазон должен совпадать с кодировкой ISO-8859-1, вы можете (в этом случае!) написать буквенную строку ISO-8859-1 с использованием этого шестнадцатеричного числа и преобразовать в UTF-8.
<?php $x = utf8_encode("\xff"); print $x; ?>
Это работает. Но, помимо сосания плохо, это не относится к символам Unicode, не включенным в ISO-8859-1.