Символ юникода в строке PHP



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



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



string str = "u1000";


в этом примере создается строка с одним символом Юникода, "числовое значение Юникода" которого равно 1000 в шестнадцатеричном формате (4096 в десятичном).



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

1547   7  

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('&#x30a8;', 0, 'UTF-8');

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

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

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

однако, есть еще один вариант. Вы можете кодировать символ непосредственно в PHP с помощью \x двоичный побег. Элемент \x escape синтаксис также поддерживается в 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?

ниже приведен 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

Comments

    Ничего не найдено.