在工作中,似乎没有一个星期不是编码相关的狂热、灾难或灾难。问题通常来自程序员,他们认为自己可以可靠地处理“文本”文件,而无需指定编码。但你不能。
因此,决定从今以后禁止文件的名称以 *.txt
或 *.text
结尾。这种想法是,那些扩展误导了随意的程序员,使他们在编码方面变得迟钝而自满,从而导致处理不当。最好还是不要
因为至少这样你就不知道你得到了什么。
然而,我们不会走那么远。相反,您将被要求使用以编码结尾的文件名。例如,对于文本文件来说,这些文件类似于 README.ascii
、 README.latin1
、 README.utf8
等等。
对于需要特定扩展名的文件,如果可以在文件内部指定编码,比如在佩尔或 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 文件。这些尤其是个问题。
一段时间以来,我一直在寻找一种方法,以编程的方式确定
一个文件,我还没有找到一个程序或库,可以可靠地区分这三种不同的8位编码。单单 MacRoman 文件就有一千多个,所以不管我们用什么字符集检测器,都能找出来。我看过的东西都不管用。我对 ICU 字符集检测器库寄予厚望,但它无法应付 MacRoman。我还研究了在 Perl 和 Python 中执行相同任务的模块,但是一次又一次都是相同的情况: 不支持检测 MacRoman。
因此,我要寻找的是一个现有的库或程序,它可靠地确定一个文件在这五种编码中的哪一种ーー最好不止这一种。特别是它必须区分我引用的三种3位编码,尤其是 MacRoman。这些文件99% 以上都是英文文本,有一些是其他语言的,但不是很多。
如果是库代码,我们首选的语言是佩尔、 c、 Java 或 Python,并且按照这个顺序。如果它只是一个程序,那么我们并不真正关心它使用的是什么语言,只要它是完全源代码的,运行在 Unix 上,并且完全没有阻碍。
还有其他人遇到过无数随机编码的遗留文本文件的问题吗?如果是这样,你是如何尝试解决这个问题的,你有多成功?这是我的问题中最重要的一个方面,但我也很感兴趣的是,您是否认为鼓励程序员使用这些文件的实际编码来命名(或重命名)他们的文件将有助于我们在未来避免这个问题。有没有人曾经试图在制度的基础上执行这一点,如果有,那个是否成功,为什么?
是的,我完全理解,鉴于问题的性质,人们为什么不能保证给出一个明确的答案。对于小文件来说尤其如此,因为您没有足够的数据继续下去。幸运的是,我们的文件很少小。除了随机的 README
文件,大多数都在50k 到250k 的大小范围内,而且许多更大。任何大于几千英镑的东西都保证是用英语写的。
问题领域是生物医学文本挖掘,因此我们有时要处理大量的、极其庞大的语料库,比如 PubMedCentral 的所有开放存取资源库。一个相当大的文件是 BioThesaurus6.0,它有5.7 GB。这个文件特别烦人,因为它是 差不多所有的 UTF-8。然而,有些笨蛋在里面插了几行8位编码的代码ーー我相信是微软的 CP1252。你要花很长时间才会被那个绊倒。:(