Символ юникода в строке PHP
этот вопрос выглядит ошеломляюще просто, но я не смог найти ответ.
что такое PHP-эквивалент следующей строки кода на C#?
string str = "u1000";
в этом примере создается строка с одним символом Юникода, "числовое значение Юникода" которого равно 1000 в шестнадцатеричном формате (4096 в десятичном).
то есть, в PHP, как я могу создать строку с одним символом Юникода, чье "числовое значение Юникода" известно?
7 ответов:
потому что JSON напрямую поддерживает
\uxxxxсинтаксис первое, что приходит в голову-это:$unicodeChar = '\u1000'; echo json_decode('"'.$unicodeChar.'"');другой вариант - использовать
mb_convert_encoding()echo mb_convert_encoding('က', 'UTF-8', 'HTML-ENTITIES');или использовать прямое сопоставление между UTF-16BE (big endian) и кодовой точкой Unicode:
echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');
PHP 7.0.0 ввел "Unicode codepoint escape" синтаксис.
теперь можно легко писать символы Юникода с помощью двойные кавычки или heredoc строку, без вызова какой-либо функции.
$unicodeChar = "\u{1000}";
PHP не знает этих escape-последовательностей Юникода. Но поскольку неизвестные escape-последовательности остаются незатронутыми, вы можете написать свою собственную функцию, которая преобразует такие escape-последовательности Unicode:
function unicodeString($str, $encoding=null) { if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding'); return preg_replace_callback('/\\u([0-9a-fA-F]{4})/u', create_function('$match', 'return mb_convert_encoding(pack("H*", $match[1]), '.var_export($encoding, true).', "UTF-16BE");'), $str); }или анонимное выражение функции вместо
create_function:function unicodeString($str, $encoding=null) { if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding'); return preg_replace_callback('/\\u([0-9a-fA-F]{4})/u', function($match) use ($encoding) { return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE'); }, $str); }использование:
$str = unicodeString("\u1000");
интересно, почему никто еще не упомянул об этом, но вы можете сделать почти эквивалентную версию, используя escape-последовательности в в двойных кавычках строки:
\x[0-9A-Fa-f]{1,2}последовательность символов, соответствующая регулярному выражению, символ в шестнадцатеричной системе счисления.
пример ASCII:
<?php echo("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21"); ?>Привет, Мир!
так что для вашего случая, все, что вам нужно сделать, это
$str = "\x30\xA2";. Но это байт, а не персонажей. Байтовое представление кодовой точки Юникода совпадает с UTF-16 big endian, поэтому мы могли бы распечатать его непосредственно как таковой:<?php header('content-type:text/html;charset=utf-16be'); echo("\x30\xA2"); ?>ア
если вы используете другую кодировку, вам нужно будет соответствующим образом изменить байты (в основном это делается с библиотекой, хотя и возможно вручную).
UTF-16 с прямым порядком байтов пример:
<?php header('content-type:text/html;charset=utf-16le'); echo("\xA2\x30"); ?>ア
UTF-8 пример:
<?php header('content-type:text/html;charset=utf-8'); echo("\xE3\x82\xA2"); ?>ア
есть еще
packфункция, но вы можете ожидать, что это будет медленно.
попробовать портативный UTF-8:
$str = utf8_chr( 0x1000 ); $str = utf8_chr( '\u1000' ); $str = utf8_chr( 4096 );все работают точно так же. Вы можете получить кодовую точку символа с помощью
utf8_ord(). подробнее о портативном UTF-8.
html_entity_decode('エ', 0, 'UTF-8');Это тоже работает. Однако решение json_decode () намного быстрее (примерно в 50 раз).
как уже упоминалось другими, PHP 7 вводит поддержку
\uсинтаксис Юникод.Как также упоминалось другими, единственный способ получить строковое значение из любого разумного описания символов Юникода в PHP-это преобразовать его из чего-то другого (например, разбор JSON, разбор HTML или какая-то другая форма). Но это связано с затратами на производительность во время выполнения.
однако, есть еще один вариант. Вы можете кодировать символ непосредственно в PHP с помощью
\xдвоичный побег. Элемент\xescape синтаксис также поддерживается в PHP 5.это особенно полезно, если вы предпочитаете не вводить символ непосредственно в строку через его естественную форму. Например, если это невидимый управляющий символ, или другой трудно обнаружить пробелы.
во-первых, доказательство пример:
// Unicode Character 'HAIR SPACE' (U+200A) $htmlEntityChar = " "; $realChar = html_entity_decode($htmlEntityChar); $phpChar = "\xE2\x80\x8A"; echo 'Proof: '; var_dump($realChar === $phpChar); // bool(true)обратите внимание, что, как упоминалось Пейсерье в другом ответе, этот двоичный код уникален для конкретной кодировки символов. В приведенный выше пример,
\xE2\x80\x8Aявляется двоичным кодированием для U + 200A в UTF-8.следующий вопрос, как вы получаете от
U+200Aдо\xE2\x80\x8A?ниже приведен PHP-скрипт для создания escape-последовательности для любого символа, основанного на строке JSON, HTML-сущности или любом другом методе, как только он будет иметь собственную строку.
function str_encode_utf8binary($str) { /** @author Krinkle 2018 */ $output = ''; foreach (str_split($str) as $octet) { $ordInt = ord($octet); // Convert from int (base 10) to hex (base 16), for PHP \x syntax $ordHex = base_convert($ordInt, 10, 16); $output .= '\x' . $ordHex; } return $output; } function str_convert_html_to_utf8binary($str) { return str_encode_utf8binary(html_entity_decode($str)); } function str_convert_json_to_utf8binary($str) { return str_encode_utf8binary(json_decode($str)); } // Example for raw string: Unicode Character 'INFINITY' (U+221E) echo str_encode_utf8binary('∞') . "\n"; // \xe2\x88\x9e // Example for HTML: Unicode Character 'HAIR SPACE' (U+200A) echo str_convert_html_to_utf8binary(' ') . "\n"; // \xe2\x80\x8a // Example for JSON: Unicode Character 'HAIR SPACE' (U+200A) echo str_convert_json_to_utf8binary('"\u200a"') . "\n"; // \xe2\x80\x8a
Comments