【问题标题】:How to convert "binary text" to "visible text"?如何将“二进制文本”转换为“可见文本”?
【发布时间】:2015-11-06 01:42:35
【问题描述】:

我有一个包含非 ASCII 字符的文本文件。 我无法检测到fileenca 的编码。

file non_ascii.txt
non_ascii.txt: Non-ISO extended-ASCII text

enca non_ascii.txt
Unrecognized encoding

但是我可以在Windows Notepad++中正常打开

编辑:上面的表述导致了误解。非常遗憾。 事实上,我是从原始文件中挑选了一些部分并将它们放入新的文本文件中,然后在记事本++中打开。

这两个部分如下所示。 notepad++ 以两种不同的方式对它们进行解码。

问题:

  1. 如何检测linux下的文件编码?
  2. 如何恢复<F1><EE><E9><E4><FF>所代表的字符? 即使“сойдя”被编码为<F1><EE><E9><E4><FF>,我也无法通过“grep 'сойдя' win.txt”获得结果?

文件内容切片如下:

less non_ascii.txt
"non_ascii.txt" may be a binary file.  See it anyway?
<F1><EE><E9><E4><FF>
<F2><F0><E0><EA><F2><EE><E2><E0><F2><FC><F1><FF>
<D0><F2><E9><E4><D7><E9><E7><E1><EC><E1><F3><F8>
<D1><E5><EA><F3><ED><E4>
<F0><E0><E7><E3><F0><F3><E7><EA><E8>
<EF><EE><E4><F1><F2><E0><E2><EB><FF><F2><FC>
<F0><E0><E7><E3><F0><F3><E7><EA><E5>
<F1><EE><E9><E4><F3>
<F0><E0><E7><E3><F0><F3><E7><EA><E0>
<F1><EE><E2><EB><E0><E4><E0><EB><E8>
<C1><D7><E9><E1><F0><EF><FE><F4><E1>
<CB><C1><D3><D3><C9><D4><C5><D2><C9><D4>
<F1><EE><E2><EB><E0><E4><E0><EB><EE>
<F1><EE><E9><E4><E8>
<F1><EE><E2><EB><E0><E4><E0><EB><E0>

【问题讨论】:

  • notepad++ 认为编码是什么?它应该在状态栏中的某处显示。
  • 我从文件中得到 2 个 sn-ps。他们正在显示“Windows-1251”和“ANSI”。文件的某些部分中可能包含其他编码。那么有没有办法将混合编码的内容转换成 UTF-8 呢?
  • 您的文件包含以不同方式编码的部分?
  • 我从各种来源获得了这个文件内容。通过python脚本从多个文件中读取行,最后写入一个文件。
  • 您不能将不同编码的文件连接起来,然后机械地将产生的混乱转换成有意义的东西。

标签: linux character-encoding


【解决方案1】:

您的问题实际上有两个部分:(1) 我如何识别未知编码和 (2) 我如何将其转换为有用的东西?

第一部分是真正的挑战,确实无法用通用术语来回答——在一般情况下,没有可靠的方法来识别未知的 8 位编码。一些编码给你很好的提示(UTF-8 就是一个很好的例子),在很多情况下,如果你对文本应该代表什么有一个很好的了解,问题就可以解决。

mapping of 8-bit character meanings 可能会有所帮助(咳咳,链接是我的),在这种情况下可以快速提示 Windows code page 1251。感谢十六进制转储和具有您期望的表示的图片!

有了它,转换很容易。

iconv -f cp1251 -t utf-8 non_ascii.txt >utf8.txt

如果您的 Linux 系统设置为在终端使用 UTF-8,您的 grep 命令现在应该可以在 utf-8.txt 上运行。

某些文本是“ANSI”(无论如何这是一个虚假术语)的指示可能只是一个红鲱鱼 - 据我所知,您摘录中的所有内容看起来都像格式正确的 CP1251。

一些tools like chardet 做了合理的工作,至少将你引导到正确的方向,尽管你必须明白,就像人类专家一样,他们必须猜测文本应该代表什么。在某些极端情况下,他们没有足够的信息来正确猜测,或者是因为有几个候选编码几乎没有差异(例如,Latin-1 vs Latin-9 vs Windows-1252,所有这些也与前 128 个位置中的普通 7 位 US-ASCII)或因为输入不包含足够的信息来建立任何常见模式。

【讨论】:

猜你喜欢
  • 2013-12-25
  • 2021-05-01
  • 2013-08-20
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多