【问题标题】:Linux using command file -i return wrong value charset=unknow-8bit for a windows-1252 encoded fileLinux 使用命令 file -i 为 windows-1252 编码文件返回错误值 charset=unknow-8bit
【发布时间】:2021-05-14 12:25:46
【问题描述】:

使用nodejs和iconv-lite在xml中创建一个字符集windows-1252的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();

浏览器下载文件,然后我在 Ubuntu 20.04 LTS 中检查它:

file -i teste.xml
/tmp/teste.xml: text/xml; charset=unknown-8bit

当我使用 gedit 打开它时,重读的 vogal 看起来很好,但欧元符号却没有(从 128 到 159 的所有字符都搞砸了)。

我签入了一个 Windows 10 虚拟机,一切顺利。在 Windows 和 Linux 网络浏览器中,它也显示一切正常。

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

谢谢

编辑 结果文件可以得到here

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

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

必须是:

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

【问题讨论】:

  • 您能否将od teste.xml 的结果粘贴到您的问题中?
  • 是的,对不起...完成了。
  • 我用正确的文件替换了下载文件。我还发现,现在这个文件给出了 charset unknown-8bit 但如果我在上面添加更多字符,它会返回 iso-8859-1。因此,必须通过某些字符触发 file -i 的结果发生变化而不改变 content-type 和 iconv 编码。

标签: node.js linux file windows-1252 cp1252


【解决方案1】:

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

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

例如,在 Windows-1252 中编码的字符“€”是位串10000000。相同的位串在其他编码中将意味着其他东西 - 大多数编码为所有 256 个可能的字节分配 some 含义。

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

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

在这种特殊情况下,“文件”命令可以查看 XML 文档内部的“编码”标记,并在那里找到“windows-1252”。我的猜测是它根本没有那个功能。因此,它使用其一般逻辑来猜测编码:它可能与 ASCII 兼容,因为它以在 ASCII 中拼写为 &lt;?xml 的字节开头;但它本身不是 ASCII,因为它的字节超出了0000000001111111 的范围;除此之外的任何东西都很难猜到,所以输出“unknown-8bit”。

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 2014-02-23
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多