将带有德语字符的ANSI文件转换为UTF8

时间:2013-08-07 15:15:48

标签: java character-encoding

我从德国网站下载了一些纯文本文件,但我不确定编码是什么。文件中没有字节标记。我正在使用一个解析器,假设文件是​​用UTF8编码的,所以它没有正确处理某些重音字符(那些属于字节范围的那些> 127)

我想将其转换为UTF8,但我不确定是否需要知道编码才能正确执行此操作。

其他人处理这些文件的方法是在Windows记事本中手动打开它并以UTF8重新保存。此过程会保留重音字符,因此我希望尽可能自动执行此转换,而无需使用Windows记事本。

Windows Notepad如何正确地将其转换为UTF8? 我应该如何将文件转换为UTF8(在Java 6中)?

1 个答案:

答案 0 :(得分:2)

在Java 7中,使用“Windows-1252”获取文本,这是Windows Latin-1。

Path oldPath = Paths.get("C:/Temp/old.txt");
Path newPath = Paths.get("C:/Temp/new.txt");
byte[] bytes = Files.readAllBytes(oldPath);
String content = "\uFEFF" + new String(bytes, "Windows-1252");
bytes = content.getBytes("UTF-8");
Files.write(newPath, bytes, StandardOption.WRITE);

这将获取字节,将它们解释为Windows Latin-1。 对于NotePad,技巧:NotePad通过前面的BOM标记字符识别编码。零宽度空间,通常不用于UTF-8。

然后从字符串中获取UTF-8编码。

Windows-1252是ISO-8859-1(纯拉丁语-1),但有一些特殊字符,如逗号引号,范围为0x80 - 0xBF。


在Java 6中:

File oldPath = new File("C:/Temp/old.txt");
File newPath = new File("C:/Temp/new.txt");
long longLength = oldPath.length();
if (longLength > Integer.MAX_VALUE) {
    throw new IllegalArgumentException("File too large: " + oldPath.getPath());
}
int fileSize = (int)longLength;
byte[] bytes = new byte[fileSize];
InputStream in = new FileInputStream(oldPath);
int nread = in.read(bytes);
in.close();
assert nread == fileSize;

String content = "\uFEFF" + new String(bytes, "Windows-1252");
bytes = content.getBytes("UTF-8");

OutputStream out = new FileOutputStream(newPath);
out.write(bytes);
out.close();