1

Javascript で、BMP ユニコード文字をバイナリに変換 (およびその逆) するにはどうすればよいですか?

組み込みの文字列メソッドが見つからないようbinaryCharCodeAt()です。そのようなものはありますか?

そうでない場合、手動で行う方法についての私の推測は、たとえば[00001111], [00001110], [00001100]などを含む配列を作成することです...

次に、バイナリを取得するには、次のことができますmyArray[String.charCodeAt(j)]

次に、バイナリからユニコードに移行するために、配列でバイナリ文字列を検索し、配列内の位置を返し、それをString.fromCharCode()

この場合、これらのバイナリ コードは任意に割り当てられ、各文字の正しいコードではありません。しかし、それは問題ありません..(正しい方が望ましいですが)バイナリが必要なだけです。

私が予見する問題は、65000 以上の項目を含む配列を何百回または何千回も検索すると、多くの処理時間がかかることです。

それで、既存のメソッドまたはライブラリはありますか、またはこれを手動で行うためのより良い方法を提案できますか?

4

2 に答える 2

3

Unicode 文字は一意のバイナリ表現を持つ必要がないため (UTF-8 などのエンコーディングに依存します)、「バイナリに戻って」と言うのは完全に正しいわけではないことに注意してください。ただし、ほとんどの UTF-... エンコーディングは、バイナリ エンコーディングに関して相互に下位互換性があると思います。

しかし、使用しているエンコーディングを気にしないと述べたので、Kolink が言ったとおりに行うことができます (彼の答えは不適切に反対票を投じられましたが、完全ではありませんでした):

編集: Esailja が指摘するように、OP は、コードポイントが 1 つしかない基本的な多言語プレーン文字にのみ関心がありました。以下のコードはやり過ぎですが、BMP コードポイントと非 BMP コードポイントの両方で動作します。

"some string".charCodeAtいくつかのエンコーディングのコードポイントの 16 進数を提供します。私の場合はUTF-16です:

"".charCodeAt(0)==55356
"".charCodeAt(1)==56513

UTF-16 では0xF0 0x9F 0x83 0x81( f09f8381) または "\uD83C\uDCC1":

"\uD83C\uDCC1"==""

charCodeAt が、ある程度の作業なしで必要な数値を提供すると仮定することはできません。Unicode は可変幅エンコーディングです。したがって、次のようにして、一貫性のある結果を得ることができます。

var UTF_BITS = 16;

function padLeftTo(string, padChar, numChars) {
    return (new Array(numChars-string.length+1)).join(padChar) + string;
}

function unicodeToBinary(char) {
    return char.split('').map(function(codepoint) {
        return padLeftTo(codepoint.charCodeAt(0).toString(2), 0, UTF_BITS);
    }).join('').split('').map(function(char){return parseInt(char)});
    //         ^^^^( ignore this part if you just want a string )^^^^
}

function binaryToUnicode(binaryList) {
    var codepointsAsNumbers = [];
    while( binaryList.length>0 ){
        var codepointBits = binaryList.slice(0,UTF_BITS);
        binaryList = binaryList.slice(UTF_BITS);
        codepointsAsNumbers.push( parseInt(codepointBits.join(''),2) );
    }
    return String.fromCharCode.apply(this,codepointsAsNumbers);
}

デモ:

> unicodeToBinary("")
[1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1]

> binaryToUnicode(unicodeToBinary(""))
""

ユースケースが何であるかを述べていないため、バイナリが実際に必要なものではない可能性があることに注意してください。たとえば、一意の識別子に満足している場合は、文字列自体、16 進文字列、さらには整数表現を使用できます。より単純な表現が必要になる可能性が高くなります。

完全な補足: オブジェクトをルックアップ テーブルとして使用する予定がある場合は、元の元の文字列 "" をキーとして使用できますtable={}; table[""]='something'; table[""]。ただし、Unicode 3.2 標準には 95156 文字あるため、メモリ内でそのようなことを行うことはお勧めしません。また、あなたはルックアップ テーブルのパフォーマンスに慣れていないのではないかと思わせるようなことも言いましたtable[...]

于 2012-04-25T18:22:56.673 に答える
0

を使用charCodeAtして 10 進数を取得し、それを呼び出しtoString(2)て 2 進数に変換します。

于 2012-04-25T16:05:51.913 に答える