相关疑难解决方法(0)

如何可靠地猜测MacRoman,CP1252,Latin1,UTF-8和ASCII之间的编码

在工作中似乎没有一周没有一些编码相关的conniption,灾难或灾难.这个问题通常来自程序员,他们认为他们可以在不指定编码的情况下可靠地处理"文本"文件.但你不能.

因此,已经决定从此以后禁止文件的名称以*.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文件.这些尤其是一个问题.

一段时间以来,我一直在寻找一种方法来以编程方式确定哪一个

  1. ASCII
  2. ISO-8859-1
  3. CP1252
  4. 的MacRoman
  5. UTF-8

文件在,我还没有找到一个程序或库,可以可靠地区分这三种不同的8位编码.我们可能单独拥有超过一千个MacRoman文件,因此我们使用的任何字符集检测器都必须能够嗅出它们.我看过的任何东西都无法解决问题.我对ICU字符集检测器库寄予厚望,但它无法处理MacRoman.我也看过模块在Perl和Python中做同样的事情,但一次又一次它总是相同的故事:不支持检测MacRoman.

我正在寻找的是一个现有的库或程序,它可靠地确定文件所在的五种编码中的哪一种 - 并且最好不止于此.特别是它必须区分我引用的三个3位编码,尤其是MacRoman.这些文件的英文文本超过99%; 其他语言中有一些,但并不多.

如果它是库代码,我们的语言首选项是它在Perl,C,Java或Python中,并按此顺序.如果它只是一个程序,那么我们并不关心它是什么语言,只要它是完整的源代码,在Unix上运行,并且完全不受阻碍.

有没有其他人有这个随机编码的遗留文本文件的问题?如果是这样,你是如何尝试解决它的,你有多成功?这是我的问题中最重要的方面,但我也对你是否认为鼓励程序员用这些文件所在的实际编码来命名(或重命名)他们的文件感兴趣,这将有助于我们避免将来出现这个问题.曾经尝试过任何人强制执行该体制的基础上,如果是的话,是成功与否,为什么?

是的,我完全明白为什么鉴于问题的性质,人们无法保证给出明确的答案.对于小文件尤其如此,您没有足够的数据可供使用.幸运的是,我们的文件很少.除随机README文件外,大多数的大小范围为50k到250k,而且许多都更大.任何超过几K的东西都保证是英文的.

问题领域是生物医学文本挖掘,因此我们有时处理广泛且极大的语料库,就像所有PubMedCentral的Open Access资源库一样.一个相当庞大的文件是BioThesaurus 6.0,为5.7千兆字节.这个文件特别烦人,因为它几乎都是UTF-8.但是,我相信,有些numbskull会在其中插入几行8位编码 - 微软CP1252.在你旅行之前需要一段时间.:(

python java macos perl character-encoding

97
推荐指数
4
解决办法
1万
查看次数

如何检测文本文件的字符编码?

我尝试检测我的文件中使用了哪个字符编码.

我尝试使用此代码来获取标准编码

public static Encoding GetFileEncoding(string srcFile)
    {
      // *** Use Default of Encoding.Default (Ansi CodePage)
      Encoding enc = Encoding.Default;

      // *** Detect byte order mark if any - otherwise assume default
      byte[] buffer = new byte[5];
      FileStream file = new FileStream(srcFile, FileMode.Open);
      file.Read(buffer, 0, 5);
      file.Close();

      if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
        enc = Encoding.UTF8;
      else if (buffer[0] == 0xfe && buffer[1] == 0xff)
        enc = Encoding.Unicode;
      else if (buffer[0] == 0 && …
Run Code Online (Sandbox Code Playgroud)

c# encoding byte-order-mark character-encoding

73
推荐指数
4
解决办法
10万
查看次数

每种语言版本的Windows的默认代码页

在哪里可以找到有关每个语言版本Windows的默认代码页的信息?即每种语言版本的"ANSI"代码页.

我找到了Windows支持代码页,但我找不到每种语言的默认值.

我猜测,例如,安装希腊语版本时,Windows-1253(希腊语)是默认设置.但是其他代码页呢?Windows-1253是否是任何其他语言版本的默认设置?

windows unicode character-encoding codepages

5
推荐指数
2
解决办法
457
查看次数