![LINUX:以 ASCII 文本显示的文件可以包含 UTF-8 数据吗](https://linux22.com/image/583976/LINUX%EF%BC%9A%E4%BB%A5%20ASCII%20%E6%96%87%E6%9C%AC%E6%98%BE%E7%A4%BA%E7%9A%84%E6%96%87%E4%BB%B6%E5%8F%AF%E4%BB%A5%E5%8C%85%E5%90%AB%20UTF-8%20%E6%95%B0%E6%8D%AE%E5%90%97.png)
LINUX 版本 Red Hat Enterprise Linux ES 版本 4
我需要确认数据库摘录是否正确输出了 UTF-8 编码的数据。我使用数据库供应商指定的机制创建了文件,但当我这样做时
$ file extract.txt
它回来了
ASCII text, with very long lines
但是,当我从主提取文件创建子文件并执行
$ file sub_extract.txt
它回来了
UTF-8 Unicode text, with very long lines
那么我的文件是否真的没问题,文件命令是否存在一些限制?有没有更好的方法来检查文件是否包含 UTF-8 数据?
答案1
file 命令仅使用文件的开头来检查其内容(出于性能原因)。如果您的文件开头仅包含 ascii 字符,file 命令会将文件报告为 ASCII。
如果提取的文件开头包含 UTF-8 字符(或 BOM-Header),则该命令会将该文件报告为 UTF-8(如第二个示例所示)。
有关魔术数字和文件头的更多信息,请参阅文件的手册页。
答案2
如果您导出仅包含英文文本和常见控制字符的数据库,并且将在导出中使用 BASE64 等编码方式对任何二进制数据进行编码,则除非存在明确的 BOM,否则 ASCII 和 UTF-8 将完全相同。
PS:UTF-16 是完全不同的,特别是因为对于某些工具来说它看起来像是完全正常的 ASCII 文本,而对于其他工具来说却是空白的,并且会让其他人感到困惑(我见过某些版本的 perl 读取和写入它很好,但完全无法用正则表达式匹配文本...)