2012-04-25 97 views
1

在Javascript中,如何将BMP unicode字符转换为二进制文件(和后面)?Unicode到二进制?

我似乎无法找到binaryCharCodeAt()不类似的东西存在任何内置的字符串的方法?

如果没有,我的猜测,怎么做手工将创建一个包含例如[00001111], [00001110], [00001100]等一系列...

然后拿到二进制文件,我可以做myArray[String.charCodeAt(j)]

然后从二元到Unicode去,我可以搜索该阵列的二进制字符串,在数组中返回它的位置,并将它放入String.fromCharCode()

在这种情况下,这些二进制代码是随意分配,以及的arent正确的药粥每个角色。但多数民众赞成..(虽然正确将是首选)我只需要任何二进制。

我预计是,要搜索包含倍65000+项目,数百或数千阵列中的问题,最终可能会花费大量的处理时间。

那么,有没有任何现有的方法或库,或者你可以提出一个更好的方式来手动做到这一点?

+0

你是什么BMP Unicode字符意味着什么? – Esailija 2012-04-25 16:16:37

+1

@Esailija,http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane – 2012-04-25 16:20:17

+0

什么错'使用String.fromCharCode( “A” .charCodeAt(0))'。 – Esailija 2012-04-25 16:24:45

回答

1

请注意,这是不完全正确的说“二进制和背部”,因为Unicode字符并不需要有一个唯一的二进制表示(这取决于编码,例如UTF-8)。不过,我相信大多数UTF -...编码在二进制编码方面是相互向后兼容的。

不过既然你说你不在乎你使用的是什么编码,你可以做的完全一样Kolink说(他的回答是不正确downvoted,但还没有完成):

编辑:作为Esailija指出,OP只对只有一个代码点的基本多语言平面字符感兴趣。下面的代码是矫枉过正的,但仍然可以在BMP和非BMP代码点上工作。

"some string".charCodeAt给你一些编码的码点的十六进制。在我的情况下,它是UTF-16:

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

在UTF-16,这是0xF0 0x9F 0x83 0x81f09f8381),或 “\ 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("")) 
"" 

请注意,由于你没有说你的用例是,二进制可能不是你想要真的是。例如,如果您满足于唯一标识符,则可以使用字符串本身,或者使用十六进制字符串或甚至整数表示形式。你更想要一个更简单的表示。

完全旁注:如果你打算使用一个对象作为查找表,你可以只使用原厂原装字符串“”为重点,例如table={}; table[""]='something'; table[""]。但是因为unicode 3.2标准中有95156个字符,所以我不会建议在内存中做这样的事情。你还说了一些让我觉得你不熟悉查找表的性能:如果你不知道,需要O(1)次做table[...]

+0

BMP字符总是在单个'.charCodeAt'中获取。 Javascript按规范使用UTF-16(或UCS2)。你可以通过运行'var l = 0x10000; 而(L--){ \t的console.log(使用String.fromCharCode(升).charCodeAt(0)===升); }' – Esailija 2012-04-25 18:57:19

+0

@Esailija:啊,我傻了,谢谢。我忘了他在问BMP。我会留下一张纸条。 – ninjagecko 2012-04-25 19:03:32

+0

作为一个旁注我仍然不知道该是什么问题,但这似乎是迄今为止最好的答案,所以+1:D – Esailija 2012-04-25 19:17:40

-1

使用charCodeAt得到十进制数,然后调用它toString(2)将其转换为二进制。

+0

这不是二进制的,它是一个字符串。以'.toString(2)'形式表示的字节需要16个字节的内存,并且需要字符串操作来处理......即使他尝试过,也不会更无效。 – Esailija 2012-04-25 16:13:54

+0

@Esailija:这是一个不合理的downvote原因,在这种情况下字符串操作看起来非常合理。 – ninjagecko 2012-04-25 17:21:26

+0

@ninjagecko该任择议定书的有关服用大量的处理时间,如果你使用字符串操作和表示(例如,表示'0xFF'作为字符串'“11111111”')实际上只适用担心。如果他没有在他的文章中提到这件事,那么你可能是对的。 – Esailija 2012-04-25 17:58:52