2012-12-25 63 views
8

這裏是PHP代碼:轉換整數數組串在JavaScript的

$arr=array(228,184,173,230,150,135,99,104,105,110,101,115,101); 
$str=''; 
foreach ($arr as $i){ 
    $str.=chr($i); 
} 
print $str; 

輸出爲:中文chinese

這裏是JavaScript代碼:

var arr=[228,184,173,230,150,135,99,104,105,110,101,115,101]; 
var str=''; 
for (i in arr){ 
    str+=String.fromCharCode(arr[i]); 
} 
console.log(str); 

輸出爲:中æchinese

那麼我應該如何處理JavaScript的數組?

+1

當我運行PHP代碼的時候,我得到了輸出'ä¸æ-‡chinese''。PHP配置有什麼特別之處嗎? – Stegrex

+0

我得到了與@Stegrex相同的確切輸出 – PhearOfRayne

+0

@Stegrex也許這是區域設置的問題。你可以嘗試在'/ etc/locale.gen'處取消註釋'zh_CN.XXX' –

回答

18

的JavaScript字符串包括UTF-16代碼單元,但是你的數組中的數字是UTF-8字符串的字節數。這裏是一個字符串,它使用decodeURIComponent()功能轉換的一種方法:

var i, str = ''; 

for (i = 0; i < arr.length; i++) { 
    str += '%' + ('0' + arr[i].toString(16)).slice(-2); 
} 
str = decodeURIComponent(str); 

執行UTF-8 UTF-16轉換以常規的方式很可能是更有效的,但需要更多的代碼。

+3

+1 - 終於明白實際問題的人。 – jfriend00

+1

@PleaseStand,「傳統方式轉換」是什麼意思?你指的是什麼「傳統方式」? – Pacerier

+2

使用你的方法我得到了一個'URIError:URI格式不正確' – Romain

-4

基本上Javascript全部視爲字符串。我們可以將字符串更改爲整數使用parseInt

我們不需要將整數更改爲字符串。嘗試在Javascript以下代碼:

var arr=[228,184,173,230,150,135,99,104,105,110,101,115,101]; 
var str=''; 
for (i in arr){ 
    str += arr[i]; 
} 
console.log(str); 
+3

你真的嘗試過嗎?你會得到「228184173 ...」,而不是OP想要什麼。 – jfriend00

1

中文字符集有不同的編碼,其中一個字符長度超過一個字節。當你這樣做時

for (i in arr){ 
    str+=String.fromCharCode(arr[i]); 
} 

你正在將每個字節轉換爲字符(實際上是字符串)並將其添加到字符串str。 你需要做的是將字節打包在一起。

我改變了你的陣列這個和它的工作對我來說:

var arr=[20013,25991,99,104,105,110,101,115,101]; 

我得到了這些代碼從here

您還可以看看this將字節打包爲字符串。

3

對於最多3個字節(U + FFFF)的字符,沒有decodeURIComponent的另一個解決方案。 功能假定該字符串是有效的UTF-8,沒有太多的錯誤檢查...

function atos(arr) { 
    for (var i=0, l=arr.length, s='', c; c = arr[i++];) 
     s += String.fromCharCode(
      c > 0xdf && c < 0xf0 && i < l-1 
       ? (c & 0xf) << 12 | (arr[i++] & 0x3f) << 6 | arr[i++] & 0x3f 
      : c > 0x7f && i < l 
       ? (c & 0x1f) << 6 | arr[i++] & 0x3f 
      : c 
     ); 

    return s 
} 
+0

我用中文,俄文,希伯來文和英文測試了這個,它工作。代碼不太可讀,但它是正確的方法。 –

5
var arry = [3,5,7,9]; 
console.log(arry.map(String)) 

結果將是['3','5','7','9']

var arry = ['3','5','7','9'] 
console.log(arry.map(Number)) 

結果將是[3,5,7,9]

+2

你在回答錯誤的問題嗎? – Pacerier

-1

似乎這些日子的最佳方式如下:

function bufferToString(arr){ 
    arr.map(function(i){return String.fromCharCode(i)}).join("") 
}