[英]How to get non-latin characters from website?
我尝试从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();
它不起作用。 :( 有任何想法吗?
InputStream阅读器有多个构造函数 ,您可以(应该/必须)在这些构造函数之一中指定编码。
您的InputStreamReader
将尝试使用您的平台默认编码(很可能是UTF-8或其中一个可怕的Windows编码器)转换通过TCP连接返回的字节。 您应该明确指定编码。
假设Web服务器做得很好,您可以在其中一个HTTP头中找到正确的编码(我忘记了哪一个)。 或者你可以假设它是iso-8859-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页面中没有指定字符集 ?
php脚本pl.php
的输出有问题。 有一个没有声明的字符集的HTTP标头Content-Type: text/html
集。 如果没有声明的字符集,客户端必须假定它是关于HTTP规范的ISO-8859-1
。 如果被解释为ISO-8859-1,被发送的身体是±ê³ó¿¡Ê£¯¬
。
php-script ąęłóżĄĘŁŻŹ
的字节代表ąęłóżĄĘŁŻŹ
如果它被声明为
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
Content-Type: text/html; charset=ISO-8859-2
作为HTTP-Header。
但是你应该考虑切换到UTF-8编码输出。
正如某人已经声明的那样,没有为响应指定charset编码。 强制将响应文档视为ISO-8859-2(通常在中欧使用)会导致显示合法的抛光字符,因此我假设这是实际使用的编码。 由于未指定编码,因此将假定为ISO-8859-1,因为这是默认值。
响应头需要包含标题Content-Type:text / html; charset = ISO-8859-2,用于正确解释字符代码点。 构造响应InputStream
时将使用此charset。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.