Unicode 文字列を HTML エンティティに変換する方法は? ( HEX
10進数ではない)
たとえば、 に変換Français
しFrançais
ます。
Unicode 文字列を HTML エンティティに変換する方法は? ( HEX
10進数ではない)
たとえば、 に変換Français
しFrançais
ます。
関連する質問で欠落している16進エンコーディングの場合:
$output = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($match) {
list($utf8) = $match;
$binary = mb_convert_encoding($utf8, 'UTF-32BE', 'UTF-8');
$entity = vsprintf('&#x%X;', unpack('N', $binary));
return $entity;
}, $input);
これは、UTF-32BE を使用した @Babaの回答に似てunpack
おりvsprintf
、書式設定のニーズに対応しています。
iconv
よりも好む場合はmb_convert_encoding
、次のようになります。
$output = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($match) {
list($utf8) = $match;
$binary = iconv('UTF-8', 'UTF-32BE', $utf8);
$entity = vsprintf('&#x%X;', unpack('N', $binary));
return $entity;
}, $input);
この文字列操作は、Get hexcode of html entities よりも少し明確です。
UCS-4
あなたの文字列はあなたが試すことができるエンコーディングのように見えます
$first = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($m) {
$char = current($m);
$utf = iconv('UTF-8', 'UCS-4', $char);
return sprintf("&#x%s;", ltrim(strtoupper(bin2hex($utf)), "0"));
}, $string);
出力
string 'Français' (length=13)
まず、最近この問題に直面したとき、コード ファイル、DB 接続、および DB テーブルがすべて UTF-8 であることを確認して解決しました。DB からの出力をエスケープする必要がある場合は、UTF-8 シンボルがそのまま残され、エスケープが試行されないようにしないでくださいhtmlspecialchars()
。htmlentities()
私にとって同様の問題を解決したため、代替ソリューションを文書化したいと思います。utf8_encode()
「特殊」文字をエスケープするためにPHPを使用していました。
私はそれらを表示用の HTML エンティティに変換したかったのですが、すべての環境に必ずしもそれらがあるとは限らないため、iconv またはそのような関数を可能な限り回避したかったため、このコードを書きました (そうでない場合は修正してください!)
$foo = 'This is my test string \u03b50';
echo unicode2html($foo);
function unicode2html($string) {
return preg_replace('/\\\\u([0-9a-z]{4})/', '&#x$1;', $string);
}
これが困っている人に役立つことを願っています:-)