Подтвердить что ты не робот

Могу ли я получить значение unicode символа или наоборот с php?

Можно ли ввести символ и вернуть значение unicode? например, я могу поставить & # 12103 в html для вывода "⽇", можно ли предоставить этот символ в качестве аргумента функции и получить номер в качестве вывода без построения таблицы юникода?

$val = someFunction("⽇");//returns 12103

или наоборот?

$val2 = someOtherFunction(12103);//returns "⽇"

Я хотел бы иметь возможность выводить фактические символы на страницу, а не коды, и я также хотел бы получить код от персонажа, если это возможно. Самое близкое, что мне нужно, это php.net/manual/en/function.mb-decode-numericentity.php, но я не могу заставить его работать, это тот код, который мне нужен, или я ошибаюсь?

4b9b3361

Ответ 1

function _uniord($c) {
    if (ord($c{0}) >=0 && ord($c{0}) <= 127)
        return ord($c{0});
    if (ord($c{0}) >= 192 && ord($c{0}) <= 223)
        return (ord($c{0})-192)*64 + (ord($c{1})-128);
    if (ord($c{0}) >= 224 && ord($c{0}) <= 239)
        return (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128);
    if (ord($c{0}) >= 240 && ord($c{0}) <= 247)
        return (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128);
    if (ord($c{0}) >= 248 && ord($c{0}) <= 251)
        return (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128);
    if (ord($c{0}) >= 252 && ord($c{0}) <= 253)
        return (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128);
    if (ord($c{0}) >= 254 && ord($c{0}) <= 255)    //  error
        return FALSE;
    return 0;
}   //  function _uniord()

и

function _unichr($o) {
    if (function_exists('mb_convert_encoding')) {
        return mb_convert_encoding('&#'.intval($o).';', 'UTF-8', 'HTML-ENTITIES');
    } else {
        return chr(intval($o));
    }
}   // function _unichr()

Ответ 2

Здесь более компактная реализация unichr/uniord на основе pack:

// code point to UTF-8 string
function unichr($i) {
    return iconv('UCS-4LE', 'UTF-8', pack('V', $i));
}

// UTF-8 string to code point
function uniord($s) {
    return unpack('V', iconv('UTF-8', 'UCS-4LE', $s))[1];
}

Ответ 3

Это также работает (для тех, кто понимает, что битвитирование может быть более читаемым, чем ответ Марк Бейкерс):

public function ordinal($str){
    $charString = mb_substr($str, 0, 1, 'utf-8');
    $size = strlen($charString);        
    $ordinal = ord($charString[0]) & (0xFF >> $size);
    //Merge other characters into the value
    for($i = 1; $i < $size; $i++){
        $ordinal = $ordinal << 6 | (ord($charString[$i]) & 127);
    }
    return $ordinal;
}

Ответ 4

Если вы используете PHP7.2 (или более позднюю версию), вам не нужно определять новую функцию. Для ваших целей есть две функции из расширения многобайтовой строки!

Чтобы получить кодовую точку символа (то есть значение Unicode), используйте mb_ord(); и чтобы получить конкретный символ из этого значения, используйте mb_chr().

Например.:

mb_chr(12103, "utf8"); // ⽇
mb_ord("⽇", "utf8"); // 12103