2012-04-25 32 views
1

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

組み込みの文字列メソッドが見つからないようです。binaryCharCodeAt()は存在しますか?そうでない場合

することは、それを手動で行う方法についての私の推測では、バイナリを取得するためにその後...ように

を例[00001111], [00001110], [00001100]ために含む配列を作成してすることです、私はその後myArray[String.charCodeAt(j)]

を行うことができますバイナリからユニコードへ行くために、私はバイナリ文字列の配列を検索し、その配列内の位置を返して、それを置くことができますString.fromCharCode()

この場合、これらのバイナリコードは任意に割り当てられ、各文字。しかし、それは大丈夫です。(正しいとは思いますが)バイナリが必要です。

私が予見する問題は、65000以上のアイテム、数百または数千回の配列を検索すると、処理時間が長くかかることがあります。

既存の方法やライブラリがありますか、手動でこれを行うより良い方法を提案できますか?

+0

BMPのユニコード文字はどういう意味ですか? – Esailija

+1

@Esailija、http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane –

+0

そして 'String.fromCharCode(" .charCodeAt(0)) 'の何が問題なのですか? – Esailija

答えて

1

ユニコード文字はユニークなバイナリ表現を必要としないので(「UTF-8」などのエンコードによって異なります)、「バイナリとバック」と言うのはまったく正しいとは限りません。しかし、私は、UTF -...エンコーディングの大部分は、バイナリエンコーディングに関して互いに後方互換性があると信じています。

しかし、あなたはKolinkが言ったように、あなたが正確に行うことができます、あなたが使用しているエンコーディングを気にしない(彼の答えは不適切downvotedましたが、また、完成されなかった)ことを述べているので:

編集:として、 Esailija氏は、OPは基本的な多言語プレーン文字にしか関心がなく、1つのコードポイントしか持たないことを指摘しています。以下のコードは残念ですが、BMPコードと非BMPコードポイントの両方で動作します。

"some string".charCodeAtは、コード化のコードポイントの16進数を示します。私のケースでは、UTF-16である:

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

でUTF-16本である0xF0 0x9F 0x83 0x81f09f8381)、または "\ uD83C \ uDCC1":あなただけのcharCodeAtが与えると仮定することはできません

"\uD83C\uDCC1"=="" 

多少の作業をせずに必要な番号を入力してください。 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進文字列や整数表現を使用することができます。あなたがより簡単な表現を望む可能性は非常に高いです。

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

+0

BMP文字は、常に単一の '.CreCodeAt'で取得されます。 Javascriptでは、仕様によってUTF-16(またはUCS2)が使用されます。これを確認するには、 'var l = 0x10000;を実行します。 while(l--){ \t console.log(String.fromCharCode(l).charCodeAt(0)=== l); } ' – Esailija

+0

@エサリヤ:ああ、愚かな私、ありがとう。彼はBMPについて尋ねていたことを忘れていました。私はメモを残します。 – ninjagecko

+0

sidenoteとして私はまだopが何を求めているのか分からないが、これはこれまでのところ最高の答えと思われる+1:D – Esailija

-1

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

+0

これはバイナリではなく、文字列です。 '.toString(2)'形式で表現されたバイトは、16バイトのメモリを必要とし、処理するために文字列の操作が必要です...試しても無効ではありません。 – Esailija

+0

@Esailija:これはダウンボートの不適切な理由です。このような状況では、文字列の操作は完全に合理的なようです。 – ninjagecko

+0

@ninjagecko多くの処理時間を費やすことに対するOPの心配は、実際には文字列の操作と表現を使用する場合にのみ適用されます(たとえば、文字列「11111111」という文字列として '0xFF'を表す)。もし彼が彼のポストでこれを言及しなかったなら、あなたはおそらく正しいだろう。 – Esailija

関連する問題