14

Unicode charcode から string/char を取得し、最終的にそれを DOM TextNode に入れて、クライアント側の JavaScript を使用して HTML ページに追加する必要があります。

現在、私はやっています:

String.fromCharCode(parseInt(charcode, 16));

charcode、charcode を含む 16 進文字列"1D400"です。返されるはずのユニコード文字は ですが、 aが返されます! 16 ビット範囲 ( 0000... FFFF) の文字は期待どおりに返されます。

説明および/または修正の提案はありますか?

前もって感謝します!

4

4 に答える 4

20

String.fromCharCode は、BMP のコード ポイント (つまり、U+FFFF まで) のみを処理できます。より高いコード ポイントを処理するには、Mozilla Developer Networkのこの関数を使用して、サロゲート ペア表現を返すことができます。

function fixedFromCharCode (codePt) {
    if (codePt > 0xFFFF) {
        codePt -= 0x10000;
        return String.fromCharCode(0xD800 + (codePt >> 10), 0xDC00 + (codePt & 0x3FF));
    } else {
        return String.fromCharCode(codePt);
    }
}
于 2011-03-27T01:31:00.047 に答える
15

問題は、JavaScript の文字は(ほとんど) UCS-2 でエンコードされていますが、JavaScript の Basic Multilingual Plane の外側の文字を UTF-16 サロゲート ペアとして表現できることです。

次の関数は、Converting punycode with dash character から Unicode に変更されています:

function utf16Encode(input) {
    var output = [], i = 0, len = input.length, value;
    while (i < len) {
        value = input[i++];
        if ( (value & 0xF800) === 0xD800 ) {
            throw new RangeError("UTF-16(encode): Illegal UTF-16 value");
        }
        if (value > 0xFFFF) {
            value -= 0x10000;
            output.push(String.fromCharCode(((value >>>10) & 0x3FF) | 0xD800));
            value = 0xDC00 | (value & 0x3FF);
        }
        output.push(String.fromCharCode(value));
    }
    return output.join("");
}

alert( utf16Encode([0x1D400]) );
于 2011-03-27T01:33:03.067 に答える
9

EcmaScript言語仕様のセクション8.4は言う

String に実際のテキスト データが含まれている場合、各要素は単一の UTF-16 コード単位と見なされます。これが文字列の実際の格納形式であるかどうかにかかわらず、文字列内の文字は、UTF-16 を使用して表されているかのように、最初のコード単位要素の位置によって番号が付けられます。文字列に対するすべての操作 (特に明記されている場合を除く) は、文字列を未微分 16 ビット符号なし整数のシーケンスとして扱います。結果の文字列が正規化された形式であることも、言語に依存した結果であることも保証されません。

したがって、補助コードポイントを UTF-16 コード単位のペアとしてエンコードする必要があります。

記事「Java プラットフォームの補助文字」では、これを行う方法が適切に説明されています。

UTF-16 は、1 つまたは 2 つの符号なし 16 ビット コード単位のシーケンスを使用して、Unicode コード ポイントをエンコードします。U+0000 から U+FFFF までの値は、同じ値で 16 ビット単位でエンコードされます。補助文字は 2 つのコード単位でエンコードされます。1 つ目は高サロゲート範囲 (U+D800 から U+DBFF) からのもので、2 つ目は低サロゲート範囲 (U+DC00 から U+DFFF) のものです。これはマルチバイト エンコーディングとコンセプトが似ているように見えるかもしれませんが、重要な違いがあります。コード ポイントとして割り当てられる文字はありません。つまり、ソフトウェアは、文字列内の個々のコード単位について、それが 1 単位の文字を表しているのか、それとも 2 単位の文字の最初または 2 番目の単位なのかを判断できます。これは、一部の従来のマルチバイト文字エンコーディングよりも大幅に改善されています。

次の表は、いくつかの文字の異なる表現を比較して示しています。

コード ポイント / UTF-16 コード単位

U+0041 / 0041

U+00DF / 00DF

U+6771 / 6771

U+10400 / D801 DC00

UTF-16 コード単位がわかったら、javascript 関数を使用して文字列を作成できますString.fromCharCode

String.fromCharCode(0xd801, 0xdc00) === ''
于 2011-03-27T01:34:12.710 に答える