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

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;

输出结果是:中文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);

输出结果为:中文 那么我应该如何在JavaScript中处理数组?

1
当我运行PHP代码时,输出为中文chinese。你的PHP配置有什么特殊之处吗? - Stegrex
我得到了与@Stegrex完全相同的输出 - PhearOfRayne
@Stegrex,可能是本地设置的问题。您可以尝试在/etc/locale.gen中取消注释 zh_CN.XXX - solomon_wzs
我不确定你的PHP代码如何处理。但对于JavaScript,正确的数组是[20013,25991,99,104,105,110,101,115,101]。 - Ravi Y
@Stegrex:你正在以ASCII格式查看它。请将其解释为UTF-8格式。 - DCoder
@Stegrex,@0DEFACED,在打印之前添加此行:header('Content-type:text/html; charset=UTF-8')。使用适当的浏览器打开它。 - Pacerier
5个回答

20
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的转换可能更有效,但需要更多的代码。

1
@PleaseStand,您所说的“传统方式转换”是什么意思?您指的是哪种“传统方式”? - Pacerier
4
用你的方法我得到了一个“URIError:URI格式不正确”的错误。 - Romain

6
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]

3

看起来现在最好的方法是以下这样:

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

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
}

我已经用中文、俄语、希伯来语和英语进行了测试,它可以运行。虽然代码不是很易读,但这是正确的方法。 - Rob H

1

中文字符集采用不同的编码方式,其中一个字符长度超过一个字节。当您这样做时

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

你正在将每个字节转换为字符(实际上是字符串),并将其添加到字符串str中。你需要做的是将这些字节打包在一起。

我将你的数组更改为以下内容,这对我有效:

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

我从这里获取了这些代码。

你也可以查看这个链接,了解如何将字节打包成字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接