我从德国网站下载了一些纯文本文件,但我不确定编码是什么。文件中没有字节标记。我正在使用一个解析器,假设文件是用UTF8编码的,所以它没有正确处理某些重音字符(那些属于字节范围的那些> 127)
我想将其转换为UTF8,但我不确定是否需要知道编码才能正确执行此操作。
其他人处理这些文件的方法是在Windows记事本中手动打开它并以UTF8重新保存。此过程会保留重音字符,因此我希望尽可能自动执行此转换,而无需使用Windows记事本。
Windows Notepad如何正确地将其转换为UTF8? 我应该如何将文件转换为UTF8(在Java 6中)?
答案 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();