6

Unicode 文字列を HTML エンティティに変換する方法は? ( HEX10進数ではない)

たとえば、 に変換FrançaisFrançaisます。

4

5 に答える 5

11

関連する質問で欠落している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 よりも少し明確です。

于 2012-11-08T00:35:44.220 に答える
8

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)
于 2012-11-08T00:15:58.990 に答える
4

まず、最近この問題に直面したとき、コード ファイル、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);
}

これが困っている人に役立つことを願っています:-)

于 2013-02-09T06:30:07.643 に答える