`

设置System的property,file.encoding 修改defaultcharset无效

    博客分类:
  • java
 
阅读更多

因为Java程序需要对字符串进行getbytes操作,总是乱码,好多朋友试图尝试修改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) {
                String csn = AccessController.doPrivileged(
                    new GetPropertyAction("file.encoding"));
                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 中file.encoding的设置详解

    然而,需要注意的是,一旦JVM启动并初始化完毕,尝试通过`System.getProperties().setProperty("file.encoding", "new_charset")`来修改`file.encoding`的值是无效的。因为`Charset.defaultCharset()`方法在JVM加载...

    JavaFX+Jfoenix 学习笔记(十)--系统托盘及解决中文乱码问题源码

    System.setProperty("file.encoding", "UTF-8"); ``` 4. 对于资源文件(如FXML或Properties文件),确保它们的编码也是UTF-8,并在加载时指定编码: ```java FXMLLoader loader = new FXMLLoader(getClass()....

    EurekaLog_7.5.0.0_Enterprise

    8)....Fixed: Removed some unnecessary file system access on startup 9)....Fixed: Possible wrong font size in EurekaLog tools 10)..Fixed: Ignore timeouts from Shell_NotifyIcon 11)..Fixed: Possible ...

    python3.6.5参考手册 chm

    PEP 519: Adding a file system path protocol PEP 495: Local Time Disambiguation PEP 529: Change Windows filesystem encoding to UTF-8 PEP 528: Change Windows console encoding to UTF-8 PEP 520: ...

    springmvc文件上传.docx

    <property name="defaultEncoding" value="UTF-8"/> ``` 以上就是使用Spring MVC进行文件上传的基本流程和技术要点。通过这种方式,开发者可以轻松地在自己的Web应用程序中集成文件上传功能。

    springmybatis

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong'); 到此为止,前期准备工作就完成了。下面开始真正配置mybatis项目了。 1. 在...

    VereORM至简持久层微架构

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; //插入一条测试数据 INSERT INTO `user` VALUES (1,'huyang',38,1000.5,'2017-05-23 17:09:59'); 7.在 test/src/VereORM.xml 只需简单配置 实体模型User 到 表 user 的...

    Clever Internet Suite (SRC) v9.1.0.0

    All TCP-based server components (SMTP, POP3, IMAP4, FTP, etc.) - the new CharSet property allows you to specify the desired character encoding for received commands and server responses. All UDP-based...

    如何解决springboot读取配置文件的中文乱码问题

    - 在Spring Boot启动类中,通过`System.setProperty("file.encoding", "UTF-8")`来设置文件编码。 通过以上一种或多种方式,一般可以解决Spring Boot读取配置文件时的中文乱码问题。在实践中,通常推荐首先检查和...

    jpivot学习总结.doc

    最后你还需要对比 jpivot.war 里的 web.xml 文件去修改你自己的 web.xml 文件。 2. 例子说明 一个Schema的xml文件,定义立方体;(feeSchema.xml) 一个jsp文件(fee.jsp),使用jpivot的标签(jp:mondrianQuery),...

    myEclipse中配置struts开发环境

    打开myEclipse,选择“File” -> “New” -> “Dynamic Web Project”,为项目命名,然后设置目标运行环境(如Tomcat或Jetty)。确保选择支持Servlet 2.4或更高版本的配置。 4. **添加Struts2库** 在项目中,右键...

    OpenCms创建网站过程图解——献给OpenCms的初学者们

    CHARSET=<cms:property name="content-encoding" default="UTF-8"/>"/> 测试网站的模板 ``` 这个模板使用了OpenCms的标签库来动态加载标题和内容。 #### 八、创建项目与页面 1. **创建项目**:定义...

    微信小程序实现上传照片代码实例解析

    <property name="defaultEncoding" value="UTF-8"></property> <!-- 指定所上传的总大小不能超过1T。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件 --> <property name="maxUploadSize" value="***...

Global site tag (gtag.js) - Google Analytics