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

Javascript: convert CSV string into a) UTF-8 and b) a 2D array

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

a) 我怎样才能将其转换为原版的 UTF-8 Javascript?

完成后,我该如何 b) 将多行 CSV 转换为普通的二维数组 Javascript?

谢谢!


[更新]

根据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

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

为了将它放入二维数组,我在 LineSeparator 上拆分,然后使用正则表达式循环,这似乎可行。

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

虽然 readText 的巨大延迟困扰着我,尤其是 WriteText 如此之快。感谢任何帮助。

看来您对字符编码的术语感到困惑,所以让我们再次确认一下。

String 只是一个字符串。 没有"UTF-16 string",也没有"UTF-8 string".

字符编码是一种在字符串和字节数组之间进行转换的协议。 UTF-16 是字符编码之一。 此外,UTF-8 和 ISO-8859-1 都是字符编码。 在 UTF-16 中,字符串 '€' 可以编码为字节数组 20 AC。 在 UTF-8 中,字符串 '€' 可以编码为字节数组 E2 82 AC。 在 ISO-8859-1 中,字节数组 E2 82 AC 可以解码为字符串 'â¬'.

现在,您可能会发现 'â¬' 不是 "UTF-16 string"。 它被 '€' 编码为 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)

参见 this answer

b) 如何在原版中将多行 CSV 转换为二维数组 Javascript?

参见 this answer