我有一堆纯文本文件,我是从第三方服务器下载的。 其中一些是胡言乱语;服务器发送了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
答案 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根据不同字节的频率猜测。