我有一个小程序,用JAVA编写的一些希伯来字母和一些数字写入文件。当我从Eclipse运行程序时,希伯来语写得很好,但如果我将它导出到可执行的JAR文件并从那里运行希伯来语变成乱码
我的代码:
if (content.length() > 0) {
FileWriter fileWriter = new FileWriter(path);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(content);
bufferedWriter.close();
}
我也尝试使用OutputStreamWriter自己设置编码:
if (content.length() > 0) {
BufferedWriter bufferedWriter = new BufferedWriter
(new OutputStreamWriter(new FileOutputStream(path), "windows-1255"));
bufferedWriter.write(content);
bufferedWriter.close();
}
我试过的编码:
当我从eclipse运行程序时,其中一些返回正确的希伯来语,但是当从JAR文件运行时,所有这些都将希伯来语变成了不同类型的乱码。我甚至不确定代码本身的编码是问题还是修复它的方法。
我在Windows 10上使用批处理文件运行JAR。我的java版本信息:
使用UTF-8时的输出示例
来自希伯来文件的一行(由eclipse生成):
210001 188 13 04/09/1804/09/18 50.00 1 123456789 לירון קטלן הרא"ה 291 רמת גן 6013
来自乱码文件的同一行(从JAR生成):
210001 188 13 04/09/1804/09/18 50.00 1 123456789 לירון קטלן הר�"ה 291 רמת גן 6013
不要介意额外的白色空间,它们应该在那里。
具有显式编码的第二个代码段正确跨平台。
检查内容是否正常Unicode:
String content="\u200F\u05D0\u05D1\u05D2\u05D3\u05D4\u200E"; // "אבגדהו"
我使用了u编码,因此java源代码是ASCII,因此java编译器的编码和编辑器的编码应该是错误的,不会导致损坏的字符串。
假设content
是一个字符串:
if (!content.isEmpty()) {
content = "\uFEFF" + content; // Add a BOM char in front for Windows
Path p = Paths.get(path);
Files.write(p, Collections.singletonList(content), StandardCharsets.UTF_8);
}
这写了一个UTF-8文件,它将导致最少的问题,除非在以色列境内,人们可能会假设一个国家特定的编码,windows-1255。
我添加了一个BOM字符作为文件的第一个字符,因此Windows可以轻松识别文件,而不是一些ANSI单字节编码,而是UTF-8 Unicode。
然后就有了代表希伯来文的问题。必须有足够的字体。
您可以选择编写HTML文件:
content = "<!DOCTYPE html><html lang="he">"
+ "<head><meta charset=\"utf-8\"></head>"
+ "<body><pre>"
+ content.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
+ "</pre></body></html>";
我发现这比编写BOM更好。
最后一件事是添加LTR('\ u200E')和RTL(从右到左,'\ u200F')标记字符,但我认为它没有问题。
在某些地方总是使用重载方法,其中编码不存在,默认为当前平台编码。
做
new InputStreamReader(..., StandardCharsets.UTF_8))
等等。