我正在使用 HttpUrlConnection
的 java InputStream
获取 URL 的主体并将其写入文件。
在我的笔记本电脑(Ubuntu/Centos 桌面版)上一切正常,但在服务器(centos 6.5 服务器版)上,特殊字符、传入的正文会变成问号乱码。
我尝试比较 Java 的 Charset.defaultCharset()
和 System.getProperty("file.encoding")
,它们在笔记本电脑和服务器上都是相同的。
谁能帮我找出与字符编码问题相关的笔记本电脑和服务器操作系统的不同之处。
StringBuilder response = new StringBuilder();
URL obj = new URL("http://www.Some URL That Has spl Char (eg. EN Dash)");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
最佳答案
在 header 中通常会给出编码(例如 connection.getContentEncoding() 可能为 null)。这对于文本很有用,可以将 InputStream 转换为 Reader (InputStreamReader) 等。
如果您正在使用 InputStream/OutputStream,那么您正在处理二进制数据 - 按原样 - 因此不会发生损坏。但是你会丢失 header 信息,这可能已经说明了一些关于编码的信息。为了保持一致性,您可能希望将任何具有给定编码的数据存储为 UTF-8。然而在 HTML 中,编码可能在内容中给出。
在给定的代码上
输入是默认编码的。这因平台甚至用户设置而异。 最好使用显式编码。
// Nice if the connection has in its headers an encoding
// or in Content-Type charset=...
String encoding = con.getContentEncoding();
if (encoding == null) {
// Otherwise ISO-8859-1 is the HTTP standard, and
// browsers extend ISO-8859-1 to Windows-1252.
encoding = "Windows-1252";
}
Charset charset = Charset.forName(encoding);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));
当然是使用正确的编码将 StringBuilder 的字符串写入媒体。
关于java - java 中 HTTPUrlConnection 的 inputStream 的默认字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51768913/