2

サロゲート ペア形式の UTF-16 でエンコードされた文字がいくつかあります。これらのサロゲート ペアを文字として画面に出力したいと考えています。

これがどのように可能か知っている人はいますか?

4

2 に答える 2

3

iconv('UTF-16', 'UTF-8', yourString)

于 2010-08-17T21:39:23.487 に答える
1

あなたの質問は少し不明確です。

UTF-16エスケープシーケンスが埋め込まれたASCIIテキストがある場合は、次の方法ですべてをUTF-8に変換できます。

function unescape_utf16($string) {
    /* go for possible surrogate pairs first */
    $string = preg_replace_callback(
        '/\\\\u(D[89ab][0-9a-f]{2})\\\\u(D[c-f][0-9a-f]{2})/i',
        function ($matches) {
            $d = pack("H*", $matches[1].$matches[2]);
            return mb_convert_encoding($d, "UTF-8", "UTF-16BE");
        }, $string);
    /* now the rest */
    $string = preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
        function ($matches) {
            $d = pack("H*", $matches[1]);
            return mb_convert_encoding($d, "UTF-8", "UTF-16BE");
        }, $string);
    return $string;
}

$string = '\uD869\uDED6';
echo unescape_utf16($string);

これにより、UTF-8の文字が得られます(BMPの外部にあるため、4バイトが必要です)。

すべてのテキストがUTF-16(HTMLタグなどを含む)である場合、出力がUTF-16であるとブラウザに伝えることができます。

header("Content-type: text/html; charset=UTF-16");

PHPスクリプトはUTF-16で記述できないため(PHPがマルチバイトサポートでコンパイルされていない限り)、これは非常にまれです。これにより、リテラル文字列の印刷が厄介になります。

したがって、おそらくUTF-16には、Webページが使用しているエンコーディングに変換したいテキストが1つしかないでしょう。この変換は次の方法で実行できます。

//replace UTF-8 with your actual page encoding
mb_convert_encoding($string, "UTF-8", "UTF-16");
于 2010-08-18T00:31:14.693 に答える