文字を入力してユニコード値を取り戻すことはできますか?たとえば、htmlに&#12103を入れて「⽇」を出力できます。その文字を関数の引数として指定し、Unicodeテーブルを作成せずに番号を出力として取得できますか?
$val = someFunction("⽇");//returns 12103
またはその逆?
$val2 = someOtherFunction(12103);//returns "⽇"
コードではなく実際の文字をページに出力できるようにしたいと思います。また、可能であれば文字からコードを取得できるようにしたいと考えています。私が欲しいものに最も近いのはphp.net/manual/en/function.mb-decode-numericentity.phpですが、動作させることができません。これは必要なコードですか、それとも間違った軌道に乗っていますか?
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()
以下は、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];
}
これも機能します(ビットシフトを理解している人にとっては、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;
}
PHP7.2以降を使用している場合は、新しい関数を定義する必要はありません。 マルチバイト文字列拡張 から目的に応じて2つの関数があります。
文字のコードポイント(つまり、Unicode値)を取得するには、 mb_ord() ;を使用します。その値から特定の文字を取得するには、 mb_chr() を使用します。
例えば。:
mb_chr(12103, "utf8"); // ⽇
mb_ord("⽇", "utf8"); // 12103
次の機能を使用できます
エンコード用
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("⽇");//will print ⽇
?>