如何从网站上获取非拉丁字符?

时间:2011-02-27 13:38:47

标签: java encoding character-encoding urlconnection

我尝试从latata.pl/pl.php获取数据并查看所有符号(polish - iso-8859-2)

 final URL url = new URL("http://latata.pl/pl.php");
    final URLConnection urlConnection = url.openConnection();
    final BufferedReader in = new BufferedReader(new InputStreamReader(
            urlConnection.getInputStream()));
    String inputLine;

    while ((inputLine = in.readLine()) != null) {
        System.out.println(inputLine);
    }
    in.close();

它不起作用。 :(任何想法?

5 个答案:

答案 0 :(得分:3)

InputStream reader has multiple constructors你可以(应该/必须)在这种情况下在其中一个构造函数中指定编码。

答案 1 :(得分:3)

您的InputStreamReader将尝试使用您的平台默认编码(很可能是UTF-8或其中一个可怕的Windows编码器)转换通过TCP连接返回的字节。您应该明确指定编码。

假设Web服务器做得很好,您可以在其中一个HTTP头中找到正确的编码(我忘记了哪一个)。或者你可以假设它是iso-8859-2,但这可能会晚点。

答案 2 :(得分:2)

这对于评论来说太长了,但谁设置了该网页?您?从我所看到的看起来不正确。

这是你得到的:

$ telnet latata.pl 80
Trying 91.205.74.65...
Connected to latata.pl.
Escape character is '^]'.
GET /pl.php HTTP/1.0
Host: latata.pl

HTTP/1.1 200 OK
Date: Sun, 27 Feb 2011 13:49:19 GMT
Server: Apache/2
X-Powered-By: PHP/5.2.16
Vary: Accept-Encoding,User-Agent
Content-Length: 10
Connection: close
Content-Type: text/html

����ʣ��Connection closed by foreign host.

HTML只是:

<html>
<head></head>
<body>±ê³ó¿¡Ê£¯¬</body>
</html>

这就是您的网页在浏览器中的显示方式。是否有正当理由说明在该HTML页面中未指定 charset

答案 3 :(得分:2)

php-script pl.php的输出有问题。有一个没有声明的字符集的HTTP标头Content-Type: text/html集。如果没有声明的charset,客户端必须假定它与HTTP规范有ISO-8859-1。如果被解释为ISO-8859-1,则发送的正文为±ê³ó¿¡Ê£¯¬

如果声明为

,则php脚本发出的字节代表ąęłóżĄĘŁŻŹ

Content-Type: text/html; charset=ISO-8859-2

您可以使用简单的代码片段进行检查,该代码片段会将错误的ISO-8859-1编码转换为ISO-8859-2:

final String test="±ê³ó¿¡Ê£¯¬";
String corrupt=new String(test.getBytes("ISO-8859-1"),"ISO-8859-2");
System.out.println(corrupt);    

输出为ąęłóżĄĘŁŻŹ,这是一些抛光字符。

作为快速解决方法,请在php脚本中设置charset,以Content-Type: text/html; charset=ISO-8859-2作为HTTP-Header输出。

但你应该考虑切换到UTF-8编码输出。

答案 4 :(得分:2)

正如某人已经声明的那样,没有为响应指定charset编码。强制将响应文档视为ISO-8859-2(通常在中欧使用)会导致显示合法的抛光字符,因此我假设这是实际使用的编码。由于未指定编码,因此将假定为ISO-8859-1,因为这是默认值。

响应标头需要包含标题 Content-Type:text / html; charset = ISO-8859-2 ,以便正确解释字符代码点。构建响应InputStream时将使用此charset。