5

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

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

我认为这些文件(ENCODING1)主要以 UTF8、ISO-8859-2 和 Windows1252 编码(并且我认为它们主要是使用其中一种编码保存的)。我正在考虑重新编码每个文件内容

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

使用 ENCODING1 和 ENCODING2 的所有可能性(对于 3 个编码,这将是 9 个选项),然后找到某种方法(例如:字符频率?)来判断 9 个结果中的哪一个是正确的。

是否有任何第三方库为此?

我尝试了 JChardet 和 ICU4J,但据我所知,它们都只能在使用 ENCODING1 的步骤发生之前检测文件的编码

谢谢,克里斯

4

2 回答 2

2

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

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();
    }
} 

在以下网址阅读更多内容

您也可以jCharDet通过 sourceforge 尝试,请参阅以下URL

干杯!!

于 2013-10-02T20:18:36.970 回答
0

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

对于基本的了解,您应该阅读http://www.joelonsoftware.com/articles/Unicode.html

如本文所述,无法确定使用了哪种原始编码;由于这篇文章,例如 Internet Explorer 通过不同字节的频率进行猜测。

于 2013-10-03T16:10:39.700 回答