java - java 中 HTTPUrlConnection 的 inputStream 的默认字符编码

标签 java linux character-encoding

我正在使用 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/

相关文章:

Java,排序分析。堆排序、快速排序 1、快速排序 2、合并排序、给定黑匣子

java - 字符串表达式解析技巧?

java - BufferedReader 返回 ISO-8859-15 字符串 - 如何转换为 UTF16 字符串?

php - sql数据字符集/字符集,设置名称不起作用

ruby - 在 Ruby 1.8 和 1.9 中使用相同的代码处理字符串编码

java - 无法从 eclipse java 连接到 mongo db 并且我没有使用 Maven/Gradle

java - 计算文件中包含非 ASCII 字符的行数

linux - Gnome,显示身份验证对话框

linux - 将域名链接到服务器

c++ - 使错误 : Missing Includes in C++ Script?