当使用Charset.forName("GB2312")
这个方法的时候,要求JVM本身包含该字符集。
Charset.availableCharsets()
查看所有可用字符集,如果不包含会报错。
public class ChineseCharsetProvider extends CharsetProvider {
private static final String GB2312 = "GB2312";
private static final String BIG5 = "Big5";
private static final String GBK = "GBK";
@Override
public Iterator<Charset> charsets() {
return Collections.emptyIterator();
}
@Override
public Charset charsetForName(String charsetName) {
if (GB2312.equalsIgnoreCase(charsetName) || BIG5.equalsIgnoreCase(charsetName))
return Charset.forName(GBK);
return Charset.defaultCharset();
}
}
使用这样一个转换器,当使用不包含的中文字符集时,转为调用可用字符集。通过在META-INF中配置进行调用。
项目resource资源文件夹下的建立META-INF/services
文件夹,在其下建一个文本,文件名为java.nio.charset.spi.CharsetProvider
。
在这个文件中,把我们刚刚写的 CharsetProvider 全类名写在里面。这样就会自动调用。