在Java字符串中保留unicode字符

时间:2015-04-10 08:01:23

标签: java string unicode utf-8 character

我在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是否会识别该角色并按照我的意愿行事。

任何输入都将不胜感激。提前谢谢。

3 个答案:

答案 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

编写HTML
PrintWriter 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元。