如何确定文本文件的编码表

Posted

技术标签:

【中文标题】如何确定文本文件的编码表【英文标题】:How to determine encoding table of a text file 【发布时间】:2011-05-14 09:47:43 【问题描述】:

我有.txt.java 文件,但我不知道如何确定文件的编码表(Unicode、UTF-8、ISO-8525,...)。是否有任何程序可以确定文件编码或查看编码?

【问题讨论】:

How to reliably guess the encoding between MacRoman, CP1252, Latin1, UTF-8, and ASCII的可能重复 【参考方案1】:

如果您使用的是 Linux,请尝试 file -i filename.txt

$ file -i vol34.tex 
vol34.tex: text/x-tex; charset=us-ascii

供参考,这是我的环境:

$ which file
/usr/bin/file
$ file --version
file-5.09
magic file from /etc/magic:/usr/share/misc/magic

一些file 版本(例如OS X/macOS 上的file-5.04)的命令行开关略有不同:

$ file -I vol34.tex 
vol34.tex: text/x-tex; charset=us-ascii
$ file --mime vol34.tex
vol34.tex: text/x-tex; charset=us-ascii

另外,看看here。

【讨论】:

它返回:somefile.txt:普通文件 file --version 带给你什么? file-5.04 ,而且,我在 Mac 上 查看我的更新答案。感谢您指出。另外,man 是你的朋友 :)【参考方案2】:

您无法可靠地检测文本文件中的编码 - 您可以做的是制作一个 通过搜索非 ascii 字符并尝试确定它是否是有根据的猜测 在您正在解析的语言中有意义的 unicode 组合。

【讨论】:

【参考方案3】:

看到这个question and the selected answer。没有万无一失的方法。最多,你可以排除一些事情。 UTF 编码你不太可能得到误报,但 8 位编码很难,特别是如果你不知道起始语言。目前没有任何工具可以处理来自 Mac、Windows、Unix 的所有常见 8 位编码,但所选答案提供了一种算法方法,该方法应该适用于特定的编码子集。

【讨论】:

【参考方案4】:

使用 Notepad++ 打开文件,会在右下角看到编码表名称。并且在菜单编码中可以更改编码表并保存文件。

【讨论】:

【参考方案5】:

在文本文件中没有保存编码的标题左右。您可以尝试使用 linux/unix 命令find 来猜测编码:

file -i unreadablefile.txt

或在某些系统上

file -I unreadablefile.txt

但这通常会给你text/plain; charset=iso-8859-1,尽管文件不可读(神秘的字形)。

这是我在安装iconv 之后为不可读文件找到正确的文件编码然后将其转换为utf8 所做的。首先,我尝试了所有编码,显示 (grep) 一行包含单词 www.(一个网站地址):

for ENCODING in $(iconv -l); do echo -n "$ENCODING "; iconv -f $ENCODING -t utf-8 unreadablefile.txt 2>/dev/null| grep 'www'; done | less

最后一个命令行显示测试的文件编码,然后是翻译/转码的行。

有些行显示出可读且一致(一次一种语言)的结果。我手动尝试了其中一些,例如:

ENCODING=WINDOWS-936; iconv -f $ENCODING -t utf-8 unreadablefile.txt -o test_with_$ENCODING.txt

在我的例子中,它是一个中文 windows 编码,现在可以阅读(如果你懂中文的话)。

【讨论】:

【参考方案6】:

是否有任何程序可以确定文件编码或查看编码?

当我写这篇文章时,这个问题已经 10 年了,答案仍然是“不”——至少不可靠。不幸的是,没有太大的改善。我最近的经验表明file -I 命令非常“hit-or-miss”。例如,在 macOS 10.15.6 上检查文本文件时:

% file -i somefile.asc
somefile.asc: application/octet-stream; charset=binary

somefile.asc 是一个文本文件。其中的所有字符都以 UTF-16 Little Endian 编码。我怎么知道的?我使用了BBedit - 一个称职的文本编辑器。确定文件中使用的编码当然是一个棘手的问题,但是...?

【讨论】:

以上是关于如何确定文本文件的编码表的主要内容,如果未能解决你的问题,请参考以下文章

java web中请求和响应中包含中文出现乱码解析

字符编码和文件处理

Java文件 ---流

24_IO_第24天(转换流缓冲流)

Git Bash 和不同编码的文本文件

java基础 流