两个问题合二为一,不确定是否允许,但它们与同一代码直接相关。 我使用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是如此之快。任何帮助表示赞赏。
答案 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。
您应该做的是修复代码以检索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。
请参见this answer。