1

我有一个 UTF-16 编码的文件

$ file myFile.csv
myFile.csv: Little-endian UTF-16 Unicode text, with CRLF line terminators

但是当我使用以下代码使用 JavaScript 打开它时

var http = new XMLHttpRequest();
http.open( "GET", url, false );
http.send( null );  
var csv = http.responseText;

结果csv变量被解释为文件是 UTF-8 格式。

结果是这样的:

[10:58:19.294] "��D\x00a\x00t\x00e\x00_\x001\x00,\x00S\x00y\x00s\x00t\x00e\x00m\x00_\x00S\x00t\x00a\x00t\x00e\x00,\x00S\x00t\x00a\x00t\x00e\x00_\x00C\x00h\x00a\x00n\x00g\x00e\x00_\x00C\x00o\x00u\x00n\x00t\x00_\x002\x00\r\x00\n\x001\x00/\x002\x00/\x002\x000\x001\x002\x00,\x00C\x00l\x00o\x00s\x00e\x00d\x00,\x001\x005\x00\r\x00\n\x001\x00/\x002\x00/\x002\x000\x001\x002\x00,\x00N\x00e\x00w\x00,\x001\x008\x00\r\x00\n\x001\x00/\x002\x00/\x002\x000\x001\x002\x00,\x00R\x00e\x00s\x00o\x00l\x00v\x00e\x00d\x00,\x003\x00\r\x00\n\x001\x00/\x003\x00/\x002\x000\x001\x002\x00,\x00D\x00e\x00f\x00e\x00r\x00r\x00e\x00d\x00,\x001\x00\r\x00\n\x001\x00/\x003\x00/\x002\x000\x001\x002\x00,\x00N\x00e\x00w\x00,\x006\x00\r\x00\n\x001\x00/\x003\x00/\x002\x000\x001\x002\x00,\x00R\x00e\x00s\x00o\x00l\x00v\x00e\x00d\x00,\x001\x00\r\x00\n\x001\x00/\x003\x00/\x002\x000\x001\x002\x00,\x00V\x00e\x00r\x00i\x00f\x00i\x00e\x00d\x00,\x009\x00\r\x00\n" […]

每个其他字符都是 NUL 字符(表示为 \x00),因此它会打乱我所有进一步的字符计数和解析。前两个字符是“替换”字符,因为在真实文件中,前 16 位表示“little-endian UTF-16 BOM”,这导致 UTF-8 中的非法字符。

当我以 HEX 格式查看文件时,我有以下第一行:

0000000: fffe 4400 6100 7400 6500 5f00 3100 2c00  ..D.a.t.e._.1.,.
0000010: 5300 7900 7300 7400 6500 6d00 5f00 5300  S.y.s.t.e.m._.S.
0000020: 7400 6100 7400 6500 2c00 5300 7400 6100  t.a.t.e.,.S.t.a.
0000030: 7400 6500 5f00 4300 6800 6100 6e00 6700  t.e._.C.h.a.n.g.
0000040: 6500 5f00 4300 6f00 7500 6e00 7400 5f00  e._.C.o.u.n.t._.
0000050: 3200 0d00 0a00 3100 2f00 3200 2f00 3200  2.....1./.2./.2.
0000060: 3000 3100 3200 2c00 4300 6c00 6f00 7300  0.1.2.,.C.l.o.s.
0000070: 6500 6400 2c00 3100 3500 0d00 0a00 3100  e.d.,.1.5.....1.
0000080: 2f00 3200 2f00 3200 3000 3100 3200 2c00  /.2./.2.0.1.2.,.
0000090: 4e00 6500 7700 2c00 3100 3800 0d00 0a00  N.e.w.,.1.8.....

我想知道为什么它不将文件解释为 UTF-16(因为它以正确的 BOM 开头),以及是否有任何方法可以更改它。它应该能够以某种方式自动确定格式(因此也可以使用 UTF-8,以及其他常见的格式,如 ASCII 和 ANSI)。

为了测试库,我使用 XMLHttpRequest 读取文件,但在部署的库中,它应该通过 JAvascript FileReader API 读取文件。这有什么区别吗?

我在 Linux(Firefox 和 Chrome)和 Windows(Firefox)上对其进行了测试,所以它看起来独立于浏览器和操作系统。

4

1 回答 1

0

你检查过setRequestHeader 方法吗?我认为您应该能够指定内容类型。此外,我怀疑浏览器会了解该特定细节。

导致我这样做的是(至少部分)此页面上的第一个示例

我希望这有帮助!

于 2013-05-12T09:24:44.730 回答