栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Java中查找默认的字符集/编码?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Java中查找默认的字符集/编码?

这真的很奇怪。。。一旦设置,默认的Charset将被缓存,并且当类在内存中时不会更改。将

"file.encoding"
属性设置为
System.setProperty("file.encoding", "Latin-1")
;无。每次
Charset.defaultCharset()
调用时,它都会返回缓存的字符集。

这是我的结果:

Default Charset=ISO-8859-1file.encoding=Latin-1Default Charset=ISO-8859-1Default Charset in Use=ISO8859_1

我正在使用JVM 1.6。

(更新)

好。我确实使用JVM 1.5重现了你的错误。

查看源代码1.5,未设置缓存的默认字符集。我不知道这是否是一个错误,但是1.6更改了此实现并使用了缓存的字符集:

JVM 1.5:

public static Charset defaultCharset() {    synchronized (Charset.class) {        if (defaultCharset == null) { java.security.PrivilegedAction pa =         new GetPropertyAction("file.encoding"); String csn = (String) AccessController.doPrivileged(pa); Charset cs = lookup(csn); if (cs != null)     return cs; return forName("UTF-8");        }        return defaultCharset;    }}

JVM 1.6:

public static Charset defaultCharset() {    if (defaultCharset == null) {        synchronized (Charset.class) { java.security.PrivilegedAction pa =         new GetPropertyAction("file.encoding"); String csn = (String) AccessController.doPrivileged(pa); Charset cs = lookup(csn); if (cs != null)     defaultCharset = cs; else     defaultCharset = forName("UTF-8");        }    }    return defaultCharset;}

当你将文件编码设置

file.encoding=Latin-1
为下次调用时
Charset.defaultCharset()
,会发生这种情况,因为未设置缓存的默认字符集,它将尝试为name查找合适的字符集
Latin-1
。找不到此名称,因为它不正确,并返回default UTF-8。

至于诸如此类的IO类为何

OutputStreamWriter
返回意外结果的原因,对于JVM 1.5和JVM 1.6
sun.nio.cs.StreamEnprer
(这些IO类使用巫婆的)实现也有所不同。
Charset.defaultCharset()
如果未为IO类提供默认编码,则JVM 1.6实现基于该方法来获取默认编码。JVM 1.5实现使用另一种方法
Converters.getDefaultEncodingName()
;来获取默认字符集。此方法使用自己的默认字符集缓存,该缓存是在JVM初始化时设置的:

JVM 1.6:

public static StreamEnprer forOutputStreamWriter(OutputStream out,        Object lock,        String charsetName)        throws UnsupportedEncodingException{    String csn = charsetName;    if (csn == null)        csn = Charset.defaultCharset().name();    try {        if (Charset.isSupported(csn)) return new StreamEnprer(out, lock, Charset.forName(csn));    } catch (IllegalCharsetNameException x) { }    throw new UnsupportedEncodingException (csn);}

JVM 1.5:

public static StreamEnprer forOutputStreamWriter(OutputStream out,        Object lock,        String charsetName)        throws UnsupportedEncodingException{    String csn = charsetName;    if (csn == null)        csn = Converters.getDefaultEncodingName();    if (!Converters.isCached(Converters.CHAR_TO_BYTE, csn)) {        try { if (Charset.isSupported(csn))     return new CharsetSE(out, lock, Charset.forName(csn));        } catch (IllegalCharsetNameException x) { }    }    return new ConverterSE(out, lock, csn);}

但是我同意这些意见。你不应该依赖此属性。这是一个实现细节。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/440186.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号