因此,我们决定从现在开始禁止文件名以
*.txt
或*.text
结尾。这样做的想法是,这些扩展名会误导普通程序员对编码的重视,从而导致处理不当。最好的情况是根本没有扩展名,因为这样至少你知道你不知道你有什么。然而,我们并不打算走得那么远。相反,我们希望您使用以编码结尾的文件名。例如,对于文本文件,文件名应该类似于
README.ascii
、README.latin1
、README.utf8
等等。
对于需要特定扩展名的文件,如果可以在文件本身中指定编码,例如在Perl或Python中,则应该这样做。对于像Java源代码这样没有内部设施的文件,您将在扩展名之前放置编码,例如SomeClass-utf8.java
。
对于输出,强烈推荐使用UTF-8。
但是对于输入,我们需要找出如何处理我们代码库中数千个名为*.txt
的文件。我们想将它们全部重命名以适应我们的新标准。但我们不可能一个个查看它们。因此,我们需要一个实际有效的库或程序。
这些文件的编码方式各不相同,包括ASCII、ISO-8859-1、UTF-8、Microsoft CP1252或Apple MacRoman。虽然我们知道我们可以判断某些内容是否为ASCII,并且我们有很大的机会知道某些内容可能是UTF-8,但我们对8位编码感到困惑。由于我们在混合Unix环境(Solaris、Linux、Darwin)中运行,大多数桌面都是Mac,因此我们有很多令人讨厌的MacRoman文件。而这些尤其是一个问题。
最近我一直在寻找一种编程方法来确定文件使用的是以下哪种编码格式:
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
我还没有找到一个可靠地区分这三种不同的 8 位编码格式的程序或库。我们可能有超过一千个 MacRoman 文件,所以无论我们使用哪种字符集检测器,它都必须能够检测出这些文件。 我看了看 ICU charset detector library,但它无法处理 MacRoman。我还看了 Perl 和 Python 中执行相同操作的模块,但总体上情况都一样:没有支持检测 MacRoman 的功能。
因此,我正在寻找一个可靠地确定文件属于这五种编码中的哪一种(最好不止这五种)的现有库或程序。特别是它必须区分我提到的三种3位编码,尤其是MacRoman。这些文件超过99%是英语文本;还有一些其他语言的文件,但数量不多。如果是库代码,我们更喜欢使用Perl、C、Java或Python编写。如果只是一个程序,那么我们并不在乎它使用的语言,只要它具有完整的源代码,可以在Unix上运行,并且没有任何限制。
是否有其他人遇到过这种问题,即存在大量旧文本文件以随机编码方式编码?如果是这样,您是如何尝试解决的,成功了吗?这是我问题中最重要的方面,但我也想知道您是否认为鼓励程序员使用实际编码命名(或重新命名)文件将有助于我们避免未来的问题。是否有人曾经试图在机构层面上强制执行这一点?如果是这样,那么它是否成功,为什么?
是的,我完全理解为什么在问题的性质下无法保证确定的答案。特别是对于小文件而言,您没有足够的数据可供使用。幸运的是,我们的文件很少是小文件。除了随机的README
文件外,大多数文件的大小范围在50k到250k之间,许多文件更大。任何超过几K的文件大小都保证是英文。
问题领域是生物医学文本挖掘,因此我们有时需要处理广泛且极大的语料库,例如PubMedCentral的开放获取资源库。一个相当巨大的文件是BioThesaurus 6.0,大小为5.7 GB。这个文件特别恼人,因为它几乎全部是UTF-8。然而,一些蠢货把其中几行编码成了某种8位编码——我相信是Microsoft CP1252。在发现这个问题之前需要花费相当长的时间。:(