所以我试图让我的程序输出一个带有名单列表的文本文件。有些名字有奇怪的字符,例如Åström。
我已经从以“UTF-8”编码的网页中抓取了这些名称列表,或者至少我很确定它的确如此,因为页面来源说
“meta http-equiv =”Content-Type“content =”text / html; charset = UTF-8“/”
这是我到目前为止所尝试的:
public static void write(List<String> list) throws IOException {
Writer out = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8");
try {
for (int i=0;i<list.size();i++) {
try {
byte[] utf8Bytes = list.get(i).getBytes("UTF-8");
out.write(new String(utf8Bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
out.write(System.getProperty("line.separator"));
}
}
finally {
out.close();
}
}
我有点困惑为什么它不起作用。我得到的输出是“Ã...ström”,这非常奇怪。
有人可以指出我正确的方向吗?谢谢!
在另一个不相关的说明中,除了笨重之外,是否有更简单的方法将新行写入文本文件
我有吗?我在某个地方看到了网络并且它有效,但我只是想知道是否有更清洁的方式。out.write(System.getProperty( “line.separator”));
答案 0 :(得分:19)
将Eclipse > Preferences > General > Workspace > Text file encoding
设置为UTF-8。
答案 1 :(得分:4)
内容确实是UTF-8,如果打印到控制台,它似乎没问题。可能导致该问题的是字符串的解码和编码,这是不必要的。而不是OutputStreamWriter尝试使用java.io.PrintWriter。它具有 println 方法,可以在最后用系统行分隔符打印出字符串。它看起来像是:
printStream.println(list.get(i));
此外,打开文件以查看它时尝试使用浏览器。它们允许您在打开后选择编码,以便您可以快速尝试多种编码以查看实际使用的内容。
答案 2 :(得分:1)
记事本不是一个功能特别丰富的编辑器。它将尝试猜测文档编码,有时使用unexpected results。 “纯文本”文档不带有关于其编码的任何元数据,这给它们带来了某些限制。 Windows应用程序(包括记事本)通常依赖于字节顺序标记(Java字符串中的U + FEFF或"\uFEFF"
)来确定编码是否为Unicode格式。这可能有助于记事本;它会对你的网页问题毫无用处。
HTML 4规范定义了how output encoding should be set。除了指定元编码外,还应设置Content-Type
HTTP标头。
您没有在网络应用中提及您正在使用的内容。 servlet应设置内容类型setContentType("text/html; charset=UTF-8")
; JSP应该使用page指令来做同样的事情。其他视图技术将提供类似的机制。
byte[] utf8Bytes = list.get(i).getBytes("UTF-8");
out.write(new String(utf8Bytes, "UTF-8"));
此代码执行一些无用的操作;它将字符数据从UTF-16转码为UTF-8,然后从UTF-8转换回UTF-16,然后将数据写入Writer
(这将再次将UTF-16转码为UTF-8)。此代码是等效的:
String str = list.get(i);
out.write(str);
使用PrintWriter
获取换行支持。