如何判断文件的原始编码

时间:2013-10-02 15:18:38

标签: java encoding

我有一堆纯文本文件,我是从第三方服务器下载的。 其中一些是胡言乱语;服务器发送了ENCODING1的信息(例如:UTF8),但实际上该文件的编码是ENCODING2(例如:Windows1252)。

有没有办法以某种方式纠正这些文件?

我认为文件是(ENCODING1)主要以UTF8,ISO-8859-2和Windows1252编码(我认为它们大多是用这些编码之一保存的)。我正在考虑用

重新编码每个文件内容

new String(String.getBytes(ENCODING1), ENCODING2)

包含ENCODING1和ENCODING2的所有可能性(3种编码将是9个选项) 然后找到一些方法(例如:charachter频率?)来判断9个结果中的哪一个是正确的。

是否有任何第三方库?

我尝试过JChardet和ICU4J,但据我所知,他们两个都只能在ENCODING1步骤发生之前检测到文件的编码

谢谢, krisy

2 个答案:

答案 0 :(得分:1)

您可以使用谷歌提供的库来检测文件的字符集,请参阅以下内容:

import org.mozilla.universalchardet.UniversalDetector;

public class TestDetector
{
    public static void main(String[] args) throws java.io.IOException
    {
        if (args.length != 1) {
            System.err.println("Usage: java TestDetector FILENAME");
            System.exit(1);
        }

        byte[] buf = new byte[4096];
        String fileName = args[0];
        java.io.FileInputStream fis = new java.io.FileInputStream(fileName);

        // (1)
        UniversalDetector detector = new UniversalDetector(null);

        // (2)
        int nread;
        while ((nread = fis.read(buf)) > 0 && !detector.isDone()) {
            detector.handleData(buf, 0, nread);
        }
        // (3)
        detector.dataEnd();

        // (4)
        String encoding = detector.getDetectedCharset();
        if (encoding != null) {
            System.out.println("Detected encoding = " + encoding);
        } else {
            System.out.println("No encoding detected.");
        }

        // (5)
        detector.reset();
    }
} 

请阅读以下URL

了解详情

您也可以尝试使用sourceforge jCharDet,请参阅以下URL

干杯!!

答案 1 :(得分:0)

内部JVM字符串始终是unicode(通过读取或创建进行转换),因此aStringVariable.getBytes(ENCODING1)仅适用于输出。

要获得基本的理解,请阅读http://www.joelonsoftware.com/articles/Unicode.html

正如本文所述,没有办法确定使用了哪种原始编码;由于这篇文章,例如Internet Explorer根据不同字节的频率猜测。