JAVA总结(三):sun.jnu.encoding与file.encoding的区别

本文解析了JAVA中的sun.jnu.encoding与file.encoding的区别及应用场景,通过实验验证了JAVA文件转为class文件时编码统一为UTF-8。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说结论,sun.jnu.encoding是指操作系统的默认编码,file.encoding是指JAVA文件的编码(请记住,不是class文件,所有class文件的编码都是UTF-8),所以,在同一个操作系统上运行的JAVA应用程序,其sun.jnu.encoding完全相同,而file.encoding即使在同一个JAVA应用程序中,JAVA文件的编码也可以不一样。

在大部分的情况下,sun.jnu.encoding对我们都是透明的。

以Windows为例,利用chcp查看默认编码:

chcp
# 输出936,也就是GBK

所以在本机运行的所有JAVA进程,sun.jnu.encoding都是GBK。

有人说sun.jnu.encoding用于文件名的编码,flle.encoding用于文件内容的编码,真的正确吗?看下面的例子:

//  此JAVA文件用UTF-8进行编码
public class SunEncodingTest {

    public static void main(String[] args) throws  IOException {
        //  输出结果与文件编码一致
        System.out.println(Charset.defaultCharset());
        createFile();
    }

    public static void createFile() throws IOException {
        String fileName = "国际米兰.txt";
        File file = new File(fileName);
        if(!file.exists()) {
            file.createNewFile();
        }
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
        writer.write(fileName);
        writer.close();
    }

}

按照上述结论的话,那么在系统中产生的文件名应该是中文乱码才对,但经过多次测试,文件名依旧显示正常,所以sun.jnu.encoding用于文件名的编码不是太靠得住的。

继续看一个有意思的现象,我们再创建一个JAVA文件,但采用GBK编码,并在常量中直接写入中文字符,如下:

public class OsEncode {

    public final static String ENCODE_STR = "国际米兰";

    public static String encode() {
        return Charset.defaultCharset().name();
    }

    public static void main(String[] args) throws IOException {
        //  输出结果与文件编码一致,GBK
        System.out.println(encode());
    }

}

如果此文件作为主函数运行,输出的结果为GBK,但其作为服务被UTF-8的JAVA类调用时,则输出UTF-8,很有意思吧!

继续测试,如果在第一个类里(UTF-8编码)也声明常量ENCODE_STR,并取值为”国际米兰”,这时我们利用winhex查看class的字节码文件,我们可以发现国际米兰都被翻译成了相同的二进制,如下:

E5 9B BD E9 99 85 E7 B1 B3 E5 85 B0

经过演算,我们可以算出国际米兰的UTF-8编码正是上述字节。

结论

无论JAVA文件(文本)采用什么编码,转换为class时,都会转为UTF-8编码。

22-Jul-2025 08:36:25.698 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/9.0.107 22-Jul-2025 08:36:25.706 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Jul 2 2025 07:01:03 UTC 22-Jul-2025 08:36:25.706 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 9.0.107.0 22-Jul-2025 08:36:25.707 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 10 22-Jul-2025 08:36:25.707 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 22-Jul-2025 08:36:25.708 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 22-Jul-2025 08:36:25.708 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: C:\Program Files\Java\jdk1.8.0_361\jre 22-Jul-2025 08:36:25.708 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 1.8.0_361-b09 22-Jul-2025 08:36:25.708 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 22-Jul-2025 08:36:25.708 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\lenovo\AppData\Local\JetBrains\IntelliJIdea2025.1\tomcat\719460bc-26a7-490b-914f-ec4be6b534af 22-Jul-2025 08:36:25.709 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\tomcat\apache-tomcat-9.0.107 22-Jul-2025 08:36:25.709 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=C:\Users\lenovo\AppData\Local\JetBrains\IntelliJIdea2025.1\tomcat\719460bc-26a7-490b-914f-ec4be6b534af\conf\logging.properties 22-Jul-2025 08:36:25.710 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 22-Jul-2025 08:36:25.710 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote= 22在idea中运行tomcat,这是运行日志的反馈
最新发布
07-23
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值