关闭

关于file.encoding的设置

标签: stringjavabytepropertiesjvm多线程
12543人阅读 评论(0) 收藏 举报
分类:

昨天有人在讨论关于设置System的property,file.encoding 修改defaultcharset无效

Properties pps=System.getProperties();
pps.setProperty("file.encoding","ISO-8859-1");

在java中,如果没有指定charset的时候,比如new String(byte[] bytes),都会调用Charset.defaultCharset()的方法

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;
    }


我们可以清楚的看到defaultCharset是只能被初始化一次,这里还是有点小问题的,在多线程并发调用的时候还是会初始话多次,当然后面都是从cache(lookup的函数)里读出来的,问题也不大。

当我们在改变System.getProperties里的file.encoding 的时候,defaultCharset已经被初始化过了,所以不会在调用初始话的代码。


当jvm 启动的时候,load class, 最后调用main函数之前,defaultCharset已经初始化好,而很多函数里都掉用了这个方法象String.getBytes, 还有 InputStreamReader, InputStreamWriter 都是调用了 Charset.defaultCharset()的方法,就不去追查谁先调用了defaultCharset。


对defaultCharset,在jvm里的语言就是初始话在启动的时候,而且不可被更改,你只能修改系统的charset,或者jvm的启动参数里加上 -Dfile.encoding="UTF-8"


题外话

在java里面String是使用char数组来表示,而java的char和c的char是不同的,java的char是双字节的, 而c 里面的char单字节,等同于java byte

也就是说我们在转化byte 到string的时候,是根据charset decode转化成char, 而我们在调用println,write string的时候,还是要把char最后encode成byte 输出到控制台,或者文件中。

而在最后调用c函数write 的时候,如果是java 的byte数组,还要转化成c 里的char数组

(*env)->GetByteArrayRegion(env, bytes, off, len, (jbyte *)buf);







0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java中的file.encoding属性到底是什么?

java中的file.encoding属性和sun.jnu.encoding属性到底是什么?从哪里来?干什么用?让我们一步步走向真相。
  • u010234516
  • u010234516
  • 2016-10-17 21:39
  • 4022

Tomcat 设置 Java File encoding

设置tomcat file encoding
  • zhoujh8648412
  • zhoujh8648412
  • 2015-07-13 19:56
  • 1201

tomcat环境中file.encoding的修改方法

花了3天时间终于解决了这个问题,还是很开心的;)问题:严重: Servlet.service() for servlet default threw exceptionjava.lang.NullPo...
  • elia1208
  • elia1208
  • 2011-04-17 16:43
  • 18574

linux下查看文件编码及修改编码

查看文件编码 在Linux中查看文件编码可以通过以下几种方式: 1.在Vim中可以直接查看文件编码 :set fileencoding 即可显示文件编码格式。 如果你只是想查看其它编码格式的文件或者想...
  • jnbbwyth
  • jnbbwyth
  • 2011-11-19 17:38
  • 283687

linux下打开中文乱码,set fileencoding 为latin1

转1. http://blog.sina.com.cn/s/blog_40e1ba640102wm26.html2.http://www.cnblogs.com/joeyupdo/archive/20...
  • u010510962
  • u010510962
  • 2017-05-09 17:06
  • 2607

java File_encoding属性

java file.encoding
  • zhuyijian135757
  • zhuyijian135757
  • 2014-07-12 00:02
  • 9135

jenkins 编码问题--记录从一个坑掉入另一个坑。

首先我要吐槽下windows的控制台默认编码GBK情景:使用jenkins构建,console 输出的中文乱码。这里因为脚本中调用了系统的taskkill指令,在进程存在时会杀掉。如果进程不存在则提示...
  • sinat_21302587
  • sinat_21302587
  • 2017-03-29 10:46
  • 8594

Jenkins控制台中乱码问题

由于服务器环境及应用层各版本的不同、编码方式的不同因此会有很多种情况会出现乱码问题。 由于Jenkins中的job运行的是独立的一个shell环境,许多的环境变量与服务器中是不一样的,因此在job中执...
  • hunterno4
  • hunterno4
  • 2014-08-07 20:42
  • 19955

vim中的encoding、fileencoding、fileencodings如何设置

encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在 .vimrc ...
  • qq_21794823
  • qq_21794823
  • 2017-07-25 13:59
  • 333

VIM编码参数:encoding,fileencoding,fileencodings,termencoding

vim 编码方式的设置   和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是,和很多来自 L...
  • softmanfly
  • softmanfly
  • 2016-01-09 23:24
  • 1352
    个人资料
    • 访问:486187次
    • 积分:5335
    • 等级:
    • 排名:第5938名
    • 原创:99篇
    • 转载:3篇
    • 译文:0篇
    • 评论:73条
    最新评论