我尝试从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();
它不起作用。 :(任何想法?
答案 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。