URLConnection 没有得到字符集

Posted

技术标签:

【中文标题】URLConnection 没有得到字符集【英文标题】:URLConnection does not get the charset 【发布时间】:2011-04-25 10:58:08 【问题描述】:

我正在使用URL.openConnection() 从服务器下载一些东西。服务员说

Content-Type: text/plain; charset=utf-8

但是connection.getContentEncoding() 返回null。怎么了?

【问题讨论】:

这个相关的帖子可能对其他人有帮助:***.com/questions/9112259/… 还有一个很好的理由connection.getContentEncoding()返回null:它返回http头的“Content-encoding”字段,不是应该给你的一个字符集。例如,如果接收到的数据被压缩并为您提供转换数据的方式以便您可以读取它,则应该使用它。 w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 【参考方案1】:

URLConnection.getContentEncoding()返回的值返回来自标头Content-Encoding的值

来自URLConnection.getContentEncoding()的代码

/**
     * Returns the value of the <code>content-encoding</code> header field.
     *
     * @return  the content encoding of the resource that the URL references,
     *          or <code>null</code> if not known.
     * @see     java.net.URLConnection#getHeaderField(java.lang.String)
     */
    public String getContentEncoding() 
       return getHeaderField("content-encoding");
    

改为使用connection.getContentType() 来检索 Content-Type 并从 Content-Type 检索字符集。我已经包含了一个关于如何做到这一点的示例代码......

String contentType = connection.getContentType();
String[] values = contentType.split(";"); // values.length should be 2
String charset = "";

for (String value : values) 
    value = value.trim();

    if (value.toLowerCase().startsWith("charset=")) 
        charset = value.substring("charset=".length());
    


if ("".equals(charset)) 
    charset = "UTF-8"; //Assumption

【讨论】:

这些方法被覆盖以在 HttpURLConnection 中返回 OP 最有可能谈论的理智值,请参阅goo.gl/wt0P substring() 参数应该是 "charset=".length()+1 @bigstones,没有。 length() 方法返回字符串的长度。 substring() 方法从位置 0 而不是 1 开始子字符串值,因此 length() 是位置 length() - 1)。如果= 符号后没有值,您的解决方案可能会导致NullPointerException 哦,现在我知道出了什么问题,我也将trim() 链接在条件中,所以在获取子字符串时,我是在未修剪的那个上做的。谢谢你,很抱歉怀疑!【参考方案2】:

这是记录在案的行为,因为 getContentEncoding() 方法被指定为返回 Content-Encoding HTTP 标头的内容,该标头未在您的示例中设置。您可以使用getContentType() 方法并自行解析生成的字符串,或者可能使用更多advanced HTTP 客户端库,例如来自Apache 的客户端库。

【讨论】:

【参考方案3】:

就像对@Buhake Sindi 答案的补充一样。如果您使用的是 Guava,则可以执行以下操作,而不是手动解析:

MediaType mediaType = MediaType.parse(httpConnection.getContentType());
Optional<Charset> typeCharset = mediaType.charset();

【讨论】:

以上是关于URLConnection 没有得到字符集的主要内容,如果未能解决你的问题,请参考以下文章

URLConnection.getURL 方法

UrlConnection 没有内容类型

Java -- 通过 URLConnection 进行http请求中文乱码

URLConnection 返回空的 inputStream

没有调用 URLConnection 委托方法

安卓案例:利用URLConnection下载网页