在Java中解析内容类型头而不验证字符集

在Java中解析内容类型头而不验证字符集,java,mime-types,Java,Mime Types,给定一个HTTP头,如: Content-Type: text/plain; charset=something 我想使用完全符合RFC的解析来提取MIME类型和字符集,但不“验证”字符集。通过验证,我的意思是我不想使用Java的内部字符集机制,以防Java不知道该字符集(但可能对其他应用程序仍有意义)。以下代码不起作用,因为它执行此验证: import org.apache.http.entity.ContentType; String header = "text/plain; char

给定一个HTTP头,如:

Content-Type: text/plain; charset=something
我想使用完全符合RFC的解析来提取MIME类型和字符集,但不“验证”字符集。通过验证,我的意思是我不想使用Java的内部字符集机制,以防Java不知道该字符集(但可能对其他应用程序仍有意义)。以下代码不起作用,因为它执行此验证:

import org.apache.http.entity.ContentType;

String header = "text/plain; charset=something";

ContentType contentType = ContentType.parse(header);
Charset contentTypeCharset = contentType.getCharset();

System.out.println(contentType.getMimeType());
System.out.println(contentTypeCharset == null ? null : contentTypeCharset.toString());

这会抛出
java.nio.charset.UnsupportedCharsetException:something

来进行解析,可以使用较低级别的解析类:

import org.apache.http.HeaderElement;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicHeaderValueParser;

String header = "text/plain; charset=something";

HeaderElement headerElement = BasicHeaderValueParser.parseHeaderElement(header, null);
String mimeType = headerElement.getName();
String charset = null;
for (NameValuePair param : headerElement.getParameters()) {
    if (param.getName().equalsIgnoreCase("charset")) {
        String s = param.getValue();
        if (!StringUtils.isBlank(s)) {
            charset = s;
        }
        break;
    }
}

System.out.println(mimeType);
System.out.println(charset);

或者,仍然可以使用和捕获
UnsupportedCharsetException
来使用

import org.apache.http.entity.ContentType;
String header=“text/plain;charset=something”;
字符串字符集名称;
字符串模拟类型;
试一试{
ContentType ContentType=ContentType.parse(header);//此处可能引发异常
mimeType=contentType.getMimeType();
Charset Charset=contentType.getCharset();
charsetName=charset!=null?charset.name():null;
}捕获(不支持的HarsetException e){
charsetName=e.getCharsetName();//提取不支持的charsetName
mimeType=header.substring(0,header.indexOf(“;”);//如果出现异常,需要单独分析mimeType
}

缺点是,
mimeType
在出现不受支持的HarsetException时也需要以不同的方式提取。

我将
头.substring(…)
部分视为头的“手动解析”形式。如果这样做,还不如手动提取字符集。在最初的问题中,我想使用一个经过验证和测试的库来实现这一点,而不是重新发明轮子。解决方案是使用标准库及其顶级函数覆盖标题
内容类型
的常见用例。只有(罕见的)异常被回退到手动解析捕获。