javac编译时出现GBK报错(错误:编码GBK的不可映射字符)

javac编译时出现GBK报错(错误:编码GBK的不可映射字符)一

这里列出我遇到的三种情况

    代码格式分别为:ANSI、UTF-8、无BOM的UTF-8(这里我用的是notepad++进行编写)

ANSI格式

    首先我们先创建一个.java源文件,且文件名和主(public)类名一定要一致,如下图:

在这里插入图片描述

注释和输出均为汉字。接下来,我们进行编译、运行:
1)打开cmd窗口:输入javac HelloWorld.java 对源程序进行编译;
2)输入 java HelloWorld 运行HelloWorld.class文件。过程如图:
在这里插入图片描述
编译成功。这是ANSI格式编码,因为在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码,所以这里即使代码里有汉字程序也不会出错。

UTF-8格式

这里代码不变只需将格式改为UTF-8即可。在改为UTF-8后,代码中的汉字会变成乱码,如图:
在这里插入图片描述
所以,需将对乱码重新改为汉字(为了演示出效果)。
我们再次进行编译,这时便会出现“错误: 编码GBK的不可映射字符”。如图:
在这里插入图片描述
因为javac采用了操作系统默认的 GBK编码解码我们读取的字节,既然报格式错误,那我们在编译时指定编码参数:javac -encoding utf-8 xxx.java。
在这里插入图片描述
这时会发现不报格式错误了,而是“非法字符”错误。这个报错暂时还没有找到解决方法。

无BOM的UTF-8格式

这里还是使用上面的代码,格式改为“以UTF-8无BOM格式编码”,改完会发现,代码里的汉字不会变为乱码。然后进行编译:(编译时注意加指定编码参数-encoding utf-8
在这里插入图片描述
编译、运行成功。
BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。

总结

1、ANSI编码格式:代码里不论出现英文、还是汉字都可以运行成功。
2、UTF-8编码格式:即使是没有汉字,只有英文,还是会报错。
3、无BOM的UTF-8编码格式:在编译源代码时,一定要加上指定编码参数-encoding utf-8 ,不加也可以编译通过,但如果输出有汉字,运行出来的结果汉字部分将会是乱码。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值