Javascript: конвертировать строку CSV в а) UTF-8 и б) 2D массив - PullRequest
0 голосов
/ 09 апреля 2019

Два вопроса в одном, не уверен, разрешено ли это, но они напрямую связаны с одним и тем же кодом.Я извлекаю строку CSV в виде HTTP-ответа в Javascript - кажется, эта строка представлена ​​в кодировке UTF-16, как, например, вместо «».

a) Как я могупреобразовать это в UTF-8 в ванильном Javascript?

Как только это будет сделано, как мне б) преобразовать многострочный CSV в 2D-массив в ванильном Javascript?

Спасибо!


[ОБНОВЛЕНИЕ]

Основываясь на указателях anqooqie, я использую следующий подход для перекодирования строки:

Хорошо, ясно - так что если честно, я пошелнемного другим способом (так как функция reencode у меня не сработала и вызвала общий код ошибки), а теперь сделайте следующее:

var O = new ActiveXObject('ADODB.Stream');
O.Type = 2; 
O.Open;
O.Charset = 'ISO-8859-1';
O.LineSeparator = 10;
O.WriteText (csvStr);
O.Position = 0;
O.Charset = 'UTF-8';

И это работает отлично и в значительной степени за долю секунды (дажехотя это CSV строки 35K).Теперь, если я хочу поместить его обратно в csvStr, я бы сделал

csvStr = O.ReadText

, но на это уходит много времени - это ожидаемое или я делаю что-то не так?

Для помещения в2D массив, я делю на LineSeparator, а затем зацикливаю с помощью регулярных выражений, что, кажется, работает.

var A = new Array
A.push(csvStr[0].match(/"[^"]*"|[^,]+/g))

Огромная задержка readText беспокоит меня, тем более, что WriteText очень быстрый.Любая помощь приветствуется.

1 Ответ

2 голосов
/ 09 апреля 2019

Похоже, вы запутались в терминах кодировки символов, поэтому давайте еще раз подтвердим.

String - это просто строка.Нет ни «строки UTF-16», ни «строки UTF-8».

Кодировка символов - это протокол, который преобразует строку и массив байтов.UTF-16 является одной из кодировок символов.Кроме того, как UTF-8, так и ISO-8859-1 являются кодировками символов.В UTF-16 строка '€' может быть закодирована в байтовый массив 20 AC.В UTF-8 строка '€' может быть закодирована в байтовый массив E2 82 AC.В ISO-8859-1 байтовый массив E2 82 AC может быть декодирован в строку 'â¬'.

Теперь вы можете обнаружить, что 'â¬' не является "строкой UTF-16".Он '€' закодирован как UTF-8 и ошибочно декодирован как ISO-8859-1.

a) Как я могу преобразовать это в UTF-8 в ванильном Javascript?

Что вам нужно сделать, это исправить код для получения файла CSV.Я не могу сказать вам, как это исправить, так как я не знаю ваш код, но я считаю, что теперь он декодирует CSV-файл как ISO-8859-1.Вам следует исправить кодировку символов с ISO-8859-1 на UTF-8.

Если код не ваш и вы не можете это исправить, вы можете использовать обходной путь.Другими словами, вы можете 1) перекодировать ошибочно декодированную строку как ISO-8859-1, и 2) перекодировать ее как UTF-8.

1)

// Note: This code requires ES5 or later.
function reencode(inputString) {
  return Array.apply(null, Array(inputString.length)).map(function (x, i) { return inputString.charCodeAt(i); });
}

2)

См. этот ответ .

b) Как преобразовать многострочный CSV в двумерный массив в vanilla Javascript?

См. этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...