Символ Unicode в строке PHP - PullRequest
140 голосов
/ 19 мая 2011

Этот вопрос выглядит смущающе простым, но я не смог найти ответ.

Что такое PHP, эквивалентный следующей строке кода C #?

string str = "\u1000";

Thissample создает строку с одним символом Unicode, чье «числовое значение Unicode» равно 1000 в шестнадцатеричном (4096 в десятичном виде). ​​

То есть в PHP как я могу создать строку с одним символом Unicode, чья «Unicode числовое значение "известно?

Ответы [ 7 ]

163 голосов
/ 19 мая 2011

Поскольку 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');
118 голосов
/ 22 декабря 2015

В PHP 7.0.0 введен синтаксис "Unicode codepoint escape" .

Теперь можно легко писать символы Юникода, используя двойные кавычки или heredoc , без вызова какой-либо функции.

$unicodeChar = "\u{1000}";
20 голосов
/ 19 мая 2011

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");
19 голосов
/ 27 января 2015

Интересно, почему никто еще не упомянул об этом, но вы можете сделать почти эквивалентную версию, используя escape-последовательности в двойных кавычках :

\x[0-9A-Fa-f]{1,2}

Последовательность символов, соответствующая регулярному выражению, представляет собой символ в шестнадцатеричной записи.

Пример ASCII:

<?php
    echo("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21");
?>

Hello World!

Так что для вашего случая все, что вам нужно сделать, это $str = "\x30\xA2";.Но это байт , а не символы.Байтное представление кодовой точки Unicode совпадает с прямым порядком байтов UTF-16, поэтому мы можем распечатать его напрямую следующим образом:

<?php
    header('content-type:text/html;charset=utf-16be');
    echo("\x30\xA2");
?>

Если выиспользуя другую кодировку, вам нужно соответствующим образом изменить байты (в основном это делается с библиотекой, хотя и вручную).

UTF-16 little endian пример:

<?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 функция, но вы можете ожидать, что она будет медленной.

7 голосов
/ 03 ноября 2013

Попробуйте Портативный UTF-8 :

$str = utf8_chr( 0x1000 );
$str = utf8_chr( '\u1000' );
$str = utf8_chr( 4096 );

Все работают точно так же. Вы можете получить кодовую точку символа с помощью utf8_ord(). Подробнее о Portable UTF-8 .

7 голосов
/ 18 января 2013
html_entity_decode('&#x30a8;', 0, 'UTF-8');

Это тоже работает.Однако решение json_decode () намного быстрее (примерно в 50 раз).

1 голос
/ 01 февраля 2018

Как уже упоминалось, в PHP 7 введена поддержка синтаксиса Unicode \u.

Как уже упоминалось другими, единственный способ получить строковое значение из любого разумного описания символа Unicode в PHP,это преобразование его из чего-то другого (например, разбор JSON, разбор HTML или какой-либо другой формы).Но это происходит за счет производительности во время выполнения.

Однако есть еще один вариант.Вы можете закодировать символ непосредственно в PHP с помощью \x двоичного экранирования.Экранирующий синтаксис \x также поддерживается в PHP 5 .

Это особенно полезно, если вы предпочитаете не вводить символ непосредственно в строку через его естественную форму.Например, если это невидимый управляющий символ или другой трудно обнаруживаемый пробел.

Во-первых, пример доказательства:

// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = "&#8202;";
$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?

* 1023?* Ниже приведен 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('&#8202;') . "\n";
// \xe2\x80\x8a

// Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
// \xe2\x80\x8a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...