2012-04-25 121 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