Символ Unicode в строке PHP
Этот вопрос выглядит неловко простым, но я не смог найти ответ.
Что такое эквивалент PHP для следующей строки кода С#?
string str = "\u1000";
Этот пример создает строку с одним символом Unicode, чье "числовое значение Unicode" равно 1000 в шестнадцатеричном формате (4096 в десятичной форме).
То есть, в PHP, как я могу создать строку с единственным символом Unicode, чье "числовое значение Unicode" известно?
Ответы
Ответ 1
Поскольку 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');
Ответ 2
PHP 7.0.0 ввел синтаксис Unicode codepoint escape.
Теперь можно легко писать символы Юникода, используя двойные кавычки или heredoc. string, не вызывая никакой функции.
$unicodeChar = "\u{1000}";
Ответ 3
PHP не знает эти escape-последовательности Unicode. Но поскольку неизвестные 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");
Ответ 4
Интересно, почему никто не упомянул об этом, но вы можете сделать почти эквивалентную версию, используя 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";
. Но это байты, а не символы. Байт-представление кодового слова Unicode совпадает с большим энтитом UTF-16, поэтому мы можем распечатать его непосредственно как таковой:
<?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
, но вы можете ожидать, что она будет медленной.
Ответ 5
html_entity_decode('エ', 0, 'UTF-8');
Это тоже работает. Однако решение json_decode() выполняется намного быстрее (около 50 раз).
Ответ 6
Попробуйте Portable UTF-8:
$str = utf8_chr( 0x1000 );
$str = utf8_chr( '\u1000' );
$str = utf8_chr( 4096 );
Все работают точно так же. Вы можете получить кодовую точку символа с помощью utf8_ord()
. Подробнее о Portable UTF-8.
Ответ 7
Юникод-символ. Экранирование строк.
попробуйте ниже.
echo "\u{01F603}";