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。
两个问题合二为一,不确定是否允许,但它们与同一代码直接相关。 我在 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。