我在java中编写一个爬虫来抓取一些网站,这些网站可能有一些unicode字符,例如“£”。当我将内容(源HTML)存储在Java String中时,这些类型的字符会丢失并被问号“?”替换。我想知道如何保持它们完好无损。相关代码如下:
protected String readWebPage(String weburl) throws IOException{
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(weburl);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
// responseBody now contains the contents of the page
httpclient.getConnectionManager().shutdown();
return responseBody;
}
// function call
String res = readWebPage(url);
PrintWriter out = new PrintWriter(outDir+name+".html");
out.println(res);
out.close();
后来在进行角色匹配时,我也希望能够做到这样的事情:
if(text.indexOf("£")>=0)
我不知道Java是否会识别该角色并按照我的意愿行事。
任何输入都将不胜感激。提前谢谢。
答案 0 :(得分:2)
使用以下代码:
FileOutputStream fileStream = new FileOutputStream(outDir+name+".html");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileStream, StandardCharsets.UTF_8)
PrintWriter out = new PrintWriter(outputStreamWriter);
来自Charset
字符编码方案是一个或多个编码字符集与一组八位字节(八位字节)序列之间的映射。 UTF-8,UTF-16,ISO 2022和EUC是字符编码方案的示例。编码方案通常与特定的编码字符集相关联;例如,UTF-8仅用于编码Unicode。然而,一些方案与多个编码字符集相关联;例如,EUC可用于编码各种亚洲编码字符集中的字符。
答案 1 :(得分:2)
您的非ASCII字符要么在输入Java或输出时丢失。
Java在内部使用Unicode字符串,因此您必须告诉它如何解码输入和编码输出。
假设HttpClient
正确解释来自远程服务器的响应并正确解码响应。
接下来,您必须确保在将内容写入磁盘时正确编码内容。 Java使用本地环境变量来猜测要使用的编码,这可能不合适。要强制进行编码,请将编码类型传递给PrintWriter:
PrintWriter out = new PrintWriter(outDir+name+".html", "UTF-8");
然后使用文本编辑器检查output.html,例如Notepad ++,以UTF-8模式运行,以确保您仍然可以看到非ASCII字符。
如果你不能,那么你需要把注意力转向输入 - HttpClient。如果远程服务器对字符编码撒谎,请参阅此答案:Set response encoding with HttpClient 3.1以获取线索。
回答你的子问题。如果告诉Java源代码的字符编码是什么,可以在源代码中使用非ASCII字符,例如“£”。这是javac
的参数,但是你可能正在使用在IDE中,您只需在属性中设置文件的字符编码,IDE将完成剩下的工作。最便携的事情是将IDE中的字符编码设置为“UTF-8”。 Eclipse允许您为整个项目或单个文件设置字符编码。
答案 2 :(得分:1)
有两个步骤。首先,将加载的String(在java中始终为Unicode)保存为UTF-8。但是,由于浏览器需要知道编码,因此文件系统上只有HTML元标记。所以你需要确保,有类似
的东西<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
2. 使用UTF-8
编写HTMLPrintWriter out = new PrintWriter(outDir+name+".html", "UTF-8");
1。首先将原始页面的HTML字符集声明修补为UTF-8。
String res2 = res.replaceFirst("charset=([-\\w]+)", "charset=UTF-8")
.replaceFirst("charset=([\"'])([-\\w]+)\1", "charset=$1UTF-8$1");
if (res2 == res) { // No charset given
res2 = res.replaceFirst("(?i)</head>",
"<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />$0");
}
res = res2;
对于具有Content-Type或(HTML5)字符集的HTML元。