Javascript:将CSV字符串转换为a)UTF-8和b)2D数组

问题描述 投票:0回答:1

两个问题合二为一,不确定是否允许,但它们与相同的代码直接相关。我在Javascript中检索CSV字符串作为HTTP响应 - 这个字符串似乎是UTF-16编码,因为它具有例如'â,'而不是'€'。

a)如何在vanilla Javascript中将其转换为UTF-8?

一旦完成,我如何b)将多行CSV转换为vanilla Javascript中的2D数组?

谢谢!


[UPDATE]

基于anqooqie的指针,我采用以下方法重新编码字符串:

好的,清楚 - 所以说实话,我采用了一种稍微不同的方式(因为重新编码功能对我不起作用并且它抛出了一般错误代码),现在执行以下操作;

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';

这种工作正常并且几乎是瞬间(即使它是一个35K行CSV)。现在,如果我想把它放回到csvStr中,我会这样做

csvStr = O.ReadText

但这需要很长时间 - 是预期还是我做错了什么?

为了将它放入2D数组中,我在LineSeparator上拆分,然后使用正则表达式进行循环,这似乎有效。

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

readText上的巨大延迟让我感到困扰,特别是WriteText非常快。任何帮助表示赞赏。

javascript csv utf-8 utf-16
1个回答
2
投票

看起来你对字符编码的术语感到困惑,所以让我们重新确认一下。

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) How can I convert this to UTF-8 in vanilla 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)

this answer

b) How do I transform the multi-line CSV into a 2D array in vanilla Javascript?

this answer

© www.soinside.com 2019 - 2024. All rights reserved.