Java 为什么此BufferedReader不以指定的UTF-8格式读取?
我正在抓取一些网站,其中一些网站包含非拉丁字符和特殊字符,如Java 为什么此BufferedReader不以指定的UTF-8格式读取?,java,encoding,utf-8,bufferedreader,Java,Encoding,Utf 8,Bufferedreader,我正在抓取一些网站,其中一些网站包含非拉丁字符和特殊字符,如“表示引号而不是”,“表示撇号而不是” 这是真正的曲线球 我将相关文本打印到控制台。当我在IDE(Netbeans)中运行它时,一切都编码良好。但当我在计算机上运行它时,“我需要你的帮助”打印为:我需要你的帮助 在任何人说我需要将我的JAVA\u TOOL\u OPTIONS环境变量设置为-Dfile.encoding=UTF8之前,让我说我已经这样做了,这仍然是一个问题。此外,我是否应该将缓冲读取器的编码指定为“UTF-8”覆盖它 以
“
表示引号而不是”
,“
表示撇号而不是”
这是真正的曲线球
我将相关文本打印到控制台。当我在IDE(Netbeans)中运行它时,一切都编码良好。但当我在计算机上运行它时,“我需要你的帮助”
打印为:我需要你的帮助
在任何人说我需要将我的JAVA\u TOOL\u OPTIONS
环境变量设置为-Dfile.encoding=UTF8
之前,让我说我已经这样做了,这仍然是一个问题。此外,我是否应该将缓冲读取器的编码指定为“UTF-8”
覆盖它
以下是一些信息:
- 我正在使用JDK 7,目标平台为1.7
- 我在Windows7上运行的所有机器都遇到了同样的问题(有些机器没有设置
JAVA\u工具\u选项,但这似乎没有任何区别)
- 我认为它使用的默认编码是Cp1252
/**
* Using the given url, this method creates and returns the buffered reader for that url
*
* @param urlString
* @return
* @throws MalformedURLException
* @throws IOException
*/
public synchronized static BufferedReader getBufferedReader(String urlString) throws MalformedURLException, IOException {
URL url = new URL(urlString);
InputStream is = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
return br;
}
IDE的输出“窗口”可能具有理解和打印utf-8字符的能力。控制台可能不太高级。这里有两种可能性。正如用户1291492所说,可能是您正确读取了内容,但您的终端使用的编码与IDE使用的编码不同
另一种可能是源数据不是UTF-8格式。如果你正在抓取一个网站,那么你应该注意该网站通过
内容类型标题告诉你它在编码时使用了什么,而不是假设它总是UTF-8格式。真不敢相信。就是这样。对不起,我一直有很多问题,所以我想我已经试过了。谢谢!@kentcdoubs让骆驼穿过针眼比让微软专有的所谓操作系统很好地与UTF-8配合要容易得多,这尤其令人恼火,因为UTF-8现在不仅是Unicode的主要文本编码,而且是web worldwi上所有文本的主要文本编码我遇到了一个问题,直接从hosta调用java程序:javamyprogram起作用,但当我试图远程运行它时me@hosta“javamyprogram”不起作用。它正在读取一个utf8输入文件。当我添加-Dfile.encoding=utf8时,它起作用了!Thx用于该代码段
try {
reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String line="";
String s ="";
try
{
line = reader.readLine();
}
catch (IOException e)
{
e.printStackTrace();
}
while (line != null)
{
s = s + line;
s =s+"\n";
try
{
line = reader.readLine();
}
catch (IOException e)
{
e.printStackTrace();
}
}
tv.setText(""+s);
}