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

时间:2019-04-09 09:13:51

标签: javascript csv utf-8 utf-16

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

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

完成后,我该怎么办 b)用香草Javascript将多行CSV转换为2D数组?

谢谢!


[更新]

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

这很好用,几乎可以瞬间完成(即使它是35,000行CSV)。现在,如果我想将其放回csvStr中,我会这样做

csvStr = O.ReadText

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

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

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

readText的巨大延迟使我感到困扰,尤其是WriteText是如此之快。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

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

字符串只是一个字符串。 没有“ 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)如何在原始Javascript中将其转换为UTF-8?

您应该做的是修复代码以检索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)如何在原始Javascript中将多行CSV转换为2D数组?

请参见this answer