系统变量file.encoding对Java的运行影响有多大?(转)good

这个话题来自: Nutz的issue 361

在考虑这个issue时, 我一直倾向于使用系统变量file.encoding来改变JVM的默认编码.

今天,我想到, 这个系统变量,对JVM的影响到底有多大呢? 我使用最简单的方法看看这个变量的影响--在JDK 1.6.0_20的src.zip文件中,查找包含file.encoding字眼的文件. 共找到4个, 分别是: 先上重头戏 java.nio.Charset类:

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

java.net.URLEncoder的静态构造方法,影响到的方法 java.net.URLEncoder.encode(String)

    static {

    dontNeedEncoding = new BitSet(256);
    int i;
    for (i = 'a'; i < = 'z'; i++) {
        dontNeedEncoding.set(i);
    }
    for (i = 'A'; i <= 'Z'; i++) {
        dontNeedEncoding.set(i);
    }
    for (i = '0'; i <= '9'; i++) {
        dontNeedEncoding.set(i);
    }
    dontNeedEncoding.set(' '); /* encoding a space to a + is done
                    * in the encode() method */
    dontNeedEncoding.set('-');
    dontNeedEncoding.set('_');
    dontNeedEncoding.set('.');
    dontNeedEncoding.set('*');

        dfltEncName = (String)AccessController.doPrivileged (
        new GetPropertyAction("file.encoding")
        );
    }

com.sun.org.apache.xml.internal.serializer.Encoding的getMimeEncoding方法(209行起)

    static String getMimeEncoding(String encoding)
    {

        if (null == encoding)
        {
            try
            {

                // Get the default system character encoding.  This may be
                // incorrect if they passed in a writer, but right now there
                // seems to be no way to get the encoding from a writer.
                encoding = System.getProperty("file.encoding", "UTF8");

                if (null != encoding)
                {

                    /*
                    * See if the mime type is equal to UTF8.  If you don't
                    * do that, then  convertJava2MimeEncoding will convert
                    * 8859_1 to "ISO-8859-1", which is not what we want,
                    * I think, and I don't think I want to alter the tables
                    * to convert everything to UTF-8.
                    */
                    String jencoding =
                        (encoding.equalsIgnoreCase("Cp1252")
                            || encoding.equalsIgnoreCase("ISO8859_1")
                            || encoding.equalsIgnoreCase("8859_1")
                            || encoding.equalsIgnoreCase("UTF8"))
                            ? DEFAULT_MIME_ENCODING
                            : convertJava2MimeEncoding(encoding);

                    encoding =
                        (null != jencoding) ? jencoding : DEFAULT_MIME_ENCODING;
                }
                else
                {
                    encoding = DEFAULT_MIME_ENCODING;
                }
            }
            catch (SecurityException se)
            {
                encoding = DEFAULT_MIME_ENCODING;
            }
        }

最后一个javax.print.DocFlavor类的静态构造方法:

    static {
    hostEncoding =
        (String)java.security.AccessController.doPrivileged(
                  new sun.security.action.GetPropertyAction("file.encoding"));
    }

可以看到,系统变量file.encoding影响到
1. Charset.defaultCharset() Java环境中最关键的编码设置
2. URLEncoder.encode(String) Web环境中最常遇到的编码使用
3. com.sun.org.apache.xml.internal.serializer.Encoding 影响对无编码设置的xml文件的读取
4. javax.print.DocFlavor 影响打印的编码

故,影响还是很大的哦, 可以说是Java中编码的一个关键钥匙!
http://wendal.net/232.html

时间: 2024-08-04 11:18:46

系统变量file.encoding对Java的运行影响有多大?(转)good的相关文章

Java遍历系统变量

CODE: //Java遍历系统变量 import java.util.*;/*** 在jdk1.4中想获取缺省的编码格式,没有好的办法,但是可以从系统变量中读取.* 54powerman* http://54powerman.blog.sohu.com**/public class EnumerateProperties { public static void main(String [] args) throws Exception{  Properties prop=System.get

[读后感]Java 控制台运行 Jar 传参的编码问题

下面这版面,太让我纠结了,谁能帮调整一下,... _________________ java -jar test.jar "一二一" 这样传进去的 "一二一" 如果打印出来,会是乱码,可以加个 -Dfile.encoding=UTF-8 来指定参数作为什么字符编码传入. java -Dfile.encoding=UTF-8 -jar test.jar "一二一" 这样,在 java 代码内打印出来的就不是乱码了. 另外: String 表示一个

向Eclipse中输入系统变量和运行参数的方法

往Eclipse中输入系统变量,run -> run--->arguments--> vm arguments. Eg: -Dlog.level=DEBUG -Dconfig.file="C:\Documents and Settings\feli\workspace\IECAgent\src\ratingAgent.config" 有一点要注意的就是如果参数中有空格,要用引号括起来.

Java环境变量怎么配置?Java环境变量设置教程

  Java环境变量怎么设置?Java语言拥有跨平台的特性,它编译的程序能够运行在多种操作系统平台上,可以实现"一次编写,到处运行"的强大功能.但是Java需要自己手动配置环境变量,这对于Java新手来说是个不小的难题.接下来,小编就教大家Java环境变量设置方法. Java环境变量设置所需工具: JDK 1.7 安装包 Java环境变量设置步骤: 想要成功配置Java的环境变量,那肯定就要安装JDK,才可以开始配置. 1.安装JDK 向导进行相关参数设置.如图: 4.选择安装的路径,

讲解使用Docker搭建Java Web运行环境_docker

Docker 是一种"轻量级"容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公司开始逐步使用 Docker 来替换现有的虚拟化平台了.作为一名 Java 程序员,我们是时候一起把 Docker 学起来了! 本文会对虚拟化技术与 Docker 容器技术做一个对比,然后引出一些 Docker 的名词术语,比如:容器.镜像等,随后将使用 Docker 搭建一个 Java Web 运行环境,最后将对本文做一个总结. 我们先来回顾一下传统虚拟化技术的体系架构: 可见,我们

详解使用Docker搭建Java Web运行环境_docker

这周末体验了一下挺火的Docker技术,记录学习笔记. >Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发, 源代码托管在 Github 上, 遵从Apache2.0协议开源.Docker的目标是实现轻量级的操作系统虚拟化解决方案. 学习Docker首先要了解几个概念: 镜像-Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息: 容器-容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,

centos7最小版本安装nginx+tomcat+java+mysql运行环境

最近项目从windows搬到linux,由于项目组成员有限并且有其它紧急的任务需要处理,因而这个任务就落到我的头上了.下面记录下centos最小版本安装nginx+tomcat+mysql+java的运行环境. centos7 minimal安装 参考:http://www.tecmint.com/centos-7-installation/ 安装java 下载Java,可到oracle官网获取相应的连接 wget http://download.oracle.com/otn-pub/java/

Java学习之Java的运行环境

Java 时下已经非常流行.全球每天有超过百万的程序员在用Java进行着程序的开发.用Java编写的程序也因为其硬件环境无关性而越来越受到人们的青睐.如果您希望成为Java世界的一员,那就看看这个系列的文章也许对您会有帮助. 无论哪种语言都需要有它特定的运行环境也就是平台,Java 同样不例外.您也许会问,Java程序不是有硬件环境无关性吗?好吧,我希望这篇文章可以回答好这个问题. 几乎所有的语言都是需要通过编译或者解释才可以被您的电脑执行.可是Java有一点不同,它同时需要这两个过程.其实,也

怎么在java项目运行时调试bug

问题描述 怎么在java项目运行时调试bug 如题,怎么在java项目运行时调试bug?这是一道面试题,感觉没思路啊. 解决方案 debug模式,log4j打印日志,单步运行打断点 解决方案二: 首先应该通过BUG的表现确定BUG可能产生的范围.如果是数据表现,那么应该关注数据操作部分的代码,简单的错误,通过代码复查应该能排除.如果是异常表现,那么看一下异常信息,获取错误代码行,如果有经验应该能直接排除.怎么看都觉得自己代码正确(貌似都这赶脚)...好吧,各种IDE工具都提供DEBUG功能,在预