я могу получить Unicode-значение символа или наоборот с php? - PullRequest
30 голосов
/ 20 февраля 2012

Можно ли ввести символ и вернуть значение Юникода?например, я могу поместить ⽇ в html, чтобы вывести «,», возможно ли дать этот символ в качестве аргумента функции и получить число в качестве вывода без построения таблицы Юникода?

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

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

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

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

Ответы [ 5 ]

34 голосов
/ 20 февраля 2012
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()
22 голосов
/ 12 декабря 2014

Вот более компактная реализация 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];
}
9 голосов
/ 04 мая 2014

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

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;
}
6 голосов
/ 04 марта 2018

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

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

например:.

mb_chr(12103, "utf8"); // ⽇
mb_ord("⽇", "utf8"); // 12103
3 голосов
/ 20 февраля 2012

Вы можете использовать следующие функции

Для кодирования

string utf8_encode ( string $data )

http://php.net/manual/en/function.utf8-encode.php

Для декодирования

string utf8_decode ( string $data )

http://php.net/manual/en/function.utf8-decode.php

Также проверьте

http://php.net/manual/en/function.htmlspecialchars.php

<?php


echo htmlspecialchars_decode("&#12103");//will print ⽇

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...