java查找最小字符集_如何查找Java中的默认字符集/编码?
這真的很奇怪…一旦設置,默認的字符集被緩存,并且在類在內存中時不會改變。使用System.setProperty(“file.encoding”,“Latin-1”)設置“file.encoding”屬性;什么也沒做。每次調用Charset.defaultCharset()時,它返回緩存的字符集。
這里是我的結果:
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=ISO-8859-1
Default Charset in Use=ISO8859_1
我使用JVM 1.6雖然。
(更新)
好。我用JVM 1.5重現了你的bug。
看看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;
}
當您下次調用Charset.defaultCharset()時將文件編碼設置為file.encoding = Latin-1時,會發生什么,因為緩存的默認字符集未設置,它將嘗試為名稱找到適當的字符集拉丁語-1。找不到此名稱,因為它不正確,并返回默認的UTF-8。
至于為什么IO類如OutputStreamWriter返回意想不到的結果,
sun.nio.cs.StreamEncoder(witch被這些IO類使用)的實現對于JVM 1.5和JVM 1.6也是不同的。 JVM 1.6實現基于Charset.defaultCharset()方法,以獲取默認編碼(如果沒有提供給IO類)。 JVM 1.5實現使用不同的方法Converters.getDefaultEncodingName();以獲取默認字符集。此方法使用它自己的緩存在JVM初始化時設置的默認字符集:
JVM 1.6:
public static StreamEncoder 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 StreamEncoder(out, lock, Charset.forName(csn));
} catch (IllegalCharsetNameException x) { }
throw new UnsupportedEncodingException (csn);
}
JVM 1.5:
public static StreamEncoder 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);
}
但我同意這些意見。您不應該依賴此屬性。這是一個實現細節。
總結
以上是生活随笔為你收集整理的java查找最小字符集_如何查找Java中的默认字符集/编码?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 文件指定位置插入_java 中
- 下一篇: mysql 磁盘组_AIX使用LV创建A