在javascript中将整数数组转换为字符串

在javascript中将整数数组转换为字符串,javascript,utf-8,Javascript,Utf 8,以下是php代码: $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; 输出为:中文中文 下面是javascript代码: var arr=[228,184,173,230,150,135,99,104,105,110,101,115,101]; var str=''; for (i in a

以下是php代码:

$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;
输出为:
中文中文

下面是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);
输出为:
228¸æchinese


那么我应该如何处理javascript中的数组呢?

javascript字符串由代码单元组成,而数组中的数字是字符串的字节。下面是转换字符串的一种方法,它使用函数:

var i, str = '';

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

以传统方式执行UTF-8到UTF-16的转换可能更有效,但需要更多的代码。

中文字符集具有不同的编码,其中一个字符的长度超过一个字节。当你这么做的时候

for (i in arr){
    str+=String.fromCharCode(arr[i]);
}
您正在将每个字节转换为字符(实际上是字符串)并将其添加到字符串str。 您需要做的是,将字节打包在一起

我将您的阵列更改为此,它对我有效:

var arr=[20013,25991,99,104,105,110,101,115,101];
我从你那里得到这些密码


您还可以查看是否将字节打包为字符串。

对于最多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
}
功能atos(arr){
对于(变量i=0,l=arr.length,s='',c;c=arr[i++];)
s+=String.fromCharCode(
c>0xdf&&c<0xf0&&i['3','5','7','9']

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

结果将是
[3,5,7,9]

现在看来最好的方法是:

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

当我运行PHP代码时,我会得到输出
ä¸æ–chinese
。您的PHP配置有什么特别之处吗?我得到的输出与@Stegrex@Stegrex可能是区域设置的问题。你可以尝试取消
zh_CN.XXX
/etc/locale.gen
上的注释。我不确定它在y中的效果如何我们的PHP代码。但是对于javascript,正确的数组是[2001325991,99104105110101115101]@Stegrex:您正在用ASCII查看它。将其解释为UTF-8。@请问,“以常规方式转换”是什么意思?什么“常规方式”你指的是什么?使用你的方法,我得到了一个
URIError:URI格式不正确
我用中文、俄文、希伯来文和英文测试了它,它很有效。代码不是很可读,但它是正确的方法。
function bufferToString(arr){
    return arr.map(function(i){return String.fromCharCode(i)}).join("")
}