两个问题合二为一,不确定是否允许,但它们与相同的代码直接相关。我在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非常快。任何帮助表示赞赏。
看起来你对字符编码的术语感到困惑,所以让我们重新确认一下。
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。
您应该做的是修复代码以检索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)