我可以得到一个字符的unicode值或反之亦然与php?

ehxuflar  于 2023-09-29  发布在  PHP
关注(0)|答案(5)|浏览(126)

是否可以输入一个字符并返回unicode值?例如,我可以在html中输入&#12103以输出“”,是否可以将该字符作为函数的参数,并将数字作为输出而无需构建unicode表?

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

还是相反

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

我希望能够输出的实际字符的网页上没有代码,我也希望能够从字符的代码,如果可能的话。最接近我想要的是php.net/manual/en/function.mb-decode-numericentity.php,但我不能让它工作,这是我需要的代码还是我走错了路?

qyyhg6bp

qyyhg6bp1#

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()
zsbz8rwp

zsbz8rwp2#

下面是基于pack的unichr/uniord的更紧凑的实现:

// 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];
}
vmjh9lq9

vmjh9lq93#

如果您使用的是PHP7.2(或更高版本),则不需要定义新函数。Multibyte String extension中有两个函数可供您使用!
获取字符的代码点(即,Unicode值),使用mb_ord();要从该值中获取特定字符,请使用mb_chr()
例如:

mb_chr(12103, "UTF-8"); // ⽇
mb_ord("⽇", "UTF-8"); // 12103
cedebl8k

cedebl8k4#

这也是可行的,(对于理解比特移位的人来说,这可能比Mark Bakers的回答更易读):

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;
}
tkclm6bt

tkclm6bt5#

您可以使用以下函数
用于编码

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 ⽇

?>

相关问题