Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Linux使用命令文件-对于windows-1252编码的文件,我返回错误的值charset=unknow-8bit_Node.js_Linux_File_Windows 1252_Cp1252 - Fatal编程技术网

Node.js Linux使用命令文件-对于windows-1252编码的文件,我返回错误的值charset=unknow-8bit

Node.js Linux使用命令文件-对于windows-1252编码的文件,我返回错误的值charset=unknow-8bit,node.js,linux,file,windows-1252,cp1252,Node.js,Linux,File,Windows 1252,Cp1252,使用nodejs和iconv-lite在带有字符集windows-1252的xml中创建http响应文件,file-i命令无法将其标识为windows-1252 服务器端: r.header('Content-Disposition', 'attachment; filename=teste.xml'); r.header('Content-Type', 'text/xml; charset=iso8859-1'); r.write(ICONVLITE.encode(`<?xml vers

使用nodejs和iconv-lite在带有字符集windows-1252的xml中创建http响应文件,file-i命令无法将其标识为windows-1252

服务器端:

r.header('Content-Disposition', 'attachment; filename=teste.xml');
r.header('Content-Type', 'text/xml; charset=iso8859-1');
r.write(ICONVLITE.encode(`<?xml version="1.0" encoding="windows-1252"?><x>€Àáção</x>`, "win1252")); //euro symbol and portuguese accentuated vogals
r.end();
当我使用gedit打开它时,加重的vogal看起来很好,但欧元符号却没有(从128到159的所有字符都被弄乱)

我在Windows10虚拟机上进行了检查,结果一切顺利。无论是在Windows还是Linux web浏览器中,它都显示了良好的性能

那么,这是文件命令中的问题吗?如何在Linux中检查文件的正确字符

多谢各位

编辑 可以获取结果文件

第二次编辑 我发现了一个错误!代码行:

    r.header('Content-Type', 'text/xml; charset=iso8859-1');
必须是:

r.header('Content-Type', 'text/xml; charset=Windows-1252');

理解字符编码是什么和不是什么很重要

一个文本文件实际上只是一个比特流;或者,因为我们基本上同意一个字节中有8位,一个字节流。字符编码是一个查找表(有时是一个更复杂的算法),用于决定为该字节流向人类显示哪些字符

例如,在Windows-1252中编码的字符“€”是位字符串
10000000
。同样的一串比特在其他编码中也意味着其他的东西——大多数编码都赋予所有256个可能的字节某种意义

如果一个软件知道该文件应该作为Windows-1252读取,它可以查找该编码的映射并向您显示一个“€”。这就是浏览器显示正确内容的方式:您在内容类型标题中告诉他们使用Windows-1252查找表

将文件保存到磁盘后,内容类型标题中的“Windows-1252”标签不会存储在任何位置。因此,任何查看该文件的程序都可以看到它包含位字符串
10000000
,但它不知道在哪个映射表中查找它。您在HTTP头中所做的任何事情都不会改变这一点——这些都不会影响它在磁盘上的保存方式


在这种情况下,“file”命令可以查看XML文档中的“encoding”标记,并在其中找到“windows-1252”。我的猜测是,它根本没有那种功能。因此,它使用它的一般逻辑来猜测编码:它可能与ASCII兼容,因为它以拼写
的字节开始。你能在你的问题中粘贴
od teste.xml
的结果吗?是的,对不起。。。完成。我用正确的文件替换了下载的文件。我还发现,现在这个文件给出了unknown-8bit字符集,但如果我在上面添加更多字符,它将返回iso-8859-1。因此,它必须由一些字符触发,即file-i的结果在不更改内容类型和iconv编码的情况下发生更改。
r.header('Content-Type', 'text/xml; charset=Windows-1252');