Преобразовать массив целых в строку в JavaScript

Вот код 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);

выход: 中æchinese

Так как мне обработать массив в JavaScript?

5 ответов

Решение

Строки 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 обычным способом, вероятно, будет более эффективным, но потребует больше кода.

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]

Кажется, лучшим способом в эти дни является следующее:

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

Другое решение без decodeURIComponent для символов длиной до 3 байтов (U+FFFF). Функция предполагает, что строка является допустимой 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
}

Китайская кодировка имеет другую кодировку, в которой один символ имеет длину более одного байта. Когда вы делаете это

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

Вы конвертируете каждый байт в символ (фактически строку) и добавляете его в строку str. Что вам нужно сделать, это собрать байты вместе.

Я изменил ваш массив на это, и это сработало для меня:

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

Я получил эти коды отсюда.

Вы также можете взглянуть на это для упаковки байтов в строку.

Другие вопросы по тегам