Символ 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('&#x30a8;', 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}";