目录

前言

一、透过现象看本质,发现问题找原因

1.查看cmd的默认编码格式:

2.查看代码文件的保存格式:

二、分析问题原因,寻找解决方案

1.指定DOS命令的编码格式:

2.修改代码文件的编码格式:

三、后续——踩坑~

问题来了~为什么通过记事本将ANSI编码格式转换为UTF-8编码格式后,出现错误: 非法字符: '\ufeff'

填坑~解决方案:


前言

小编最近在写javaDemo时,使用的是文本文档,后缀名为.java的形式,代码中因为有中文以及特殊符号存在,导致DOS编码后出现错误:“编码GBK 的不可映射字符”。

javaDemo代码:

/** 运算符之一:算术运算符*  + - * / % (前)++ (后)++ (前)-- (后)--  +(连接符)*/
class Test {public static void main(String[] args) {//除号:/int num1=12;int num2=5;int result=num1/num2;System.out.println(result); // 2int result2=num1/num2*num2;System.out.println(result2); //10double result3=num1/num2; //int转doubleSystem.out.println(result3); //2.0double result4=num1/num2+0.0; //2.0: int转doubledouble result5=num1/(num2+0.0); //2.4 : 12/5.0=2.4System.out.println(result5);double result6=(double)num1 / num2; //2.4:double12/int5=2.4System.out.println(result6);double result7=(double)(num1/num2); //2.0:int2转为doubleSystem.out.println(result7);}
}

使用javac命令编译,出现的问题:

一、透过现象看本质,发现问题找原因

既然问题描述显示为 java “错误:编码GBK 的不可映射字符”,那便确定应该是编码格式的原因。进一步思考,为什么会出现编码格式的问题呢?——查看cmd默认的编码格式与文件的编码格式是否一致?

1.查看cmd的默认编码格式:

  • 通过cmd命令查看:chcp

  • 通过属性查看:

通过两种方式查看cmd的默认编码格式都是936,936是什么呢?CP936其实就是GBK,IBM在发明Code Page的时候将GBK放在第936页,所以叫CP936。

2.查看代码文件的保存格式:

通过记事本,打开代码文件:

 查看代码文件的格式,发现文件的编码格式默认是UTF-8,与cmd的默认编码格式不同。

关于GBK和UTF-8编码格式的区别:

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification) ,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。这一版的GBK规范为1.0版。
而UTF-8: UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

所以GBK和UTF-8简单的来说,区别就是编码方式不同,表示的文字范围不同。

二、分析问题原因,寻找解决方案

既然发现cmd默认的编码格式与文件的编码格式不一致,那便解决编码不一致的问题,可以从两方面入手:

1.指定DOS命令的编码格式:

根据代码文件的格式(UTF-8),指定DOS命令的编码格式为UTF-8:javac -encoding UTF-8 Test.java

编码通过:

2.修改代码文件的编码格式:

根据cmd的默认编码格式,记事本打开java源文件,另存为文件编码格式选择ANSI(埋雷、踩坑!!!):

再使用cmd默认的编码格式执行javac命令,编译成功:

说明:

ANSI:美国国家标准协会,系统预设的标准文字储存格式。简体中文编码GB2312,实际上它是ANSI的一个代码页936

UTF-8:通用字集转换格式,这是为传输而设计的编码,2进制,以8位为单元对Unicode进行编码,如果使用只能在同类位元组内支持8个位元的重要资料一类的旧式传输媒体,可选择UTF-8格式。

在UTF-8里,英文字符仍然跟ASCII编码一样,因此原先的函数库可以继续使用。而中文的编码范围是在0080-07FF之间,因此是2个字节表示(但这两个字节和GB编码的两个字节是不同的),用专门的Unicode处理类可以对UTF编码进行处理。

通过以上两种方式将javac执行命令的编码格式与文件编码格式统一,这样便可以成功编译!

三、后续——踩坑~

虽然通过记事本打开java源文件,另存为文件编码格式选择ANSI,这种方式可以实现javac成功编译代码文件,但是会导致代码中的中文和特殊字符显示为乱码,如下图所示;

既然如此,那小编想把ANSI编码格式的文件重新另存为UTF-8,然后采取指定DOS为UTF-8的方式解决编码问题,结果出现了新的问题:

指定DOS命令的编码格式为UTF-8:javac -encoding UTF-8 Test.java,出现新的问题:Test.java:1: 错误: 非法字符: '\ufeff'

问题来了~为什么通过记事本将ANSI编码格式转换为UTF-8编码格式后,出现错误: 非法字符: '\ufeff'

寻找原因:通过不同的代码工具打开该文件,查看该文件的编码格式是否成功转换为UTF-8格式:

①通过Windows记事本打开,显示为UTF-8:

②通过IDEA打开该文件,显示为UTF-8:

③通过Visual Studio Code 打开,发现该文件并没有转换成了UTF-8格式,而是UTF-8 with BOM格式:

为什么使用不同的编译器查看到的该文件编码格式不一致呢?

原来这是因为Windows记事本在修改UTF-8文件时自作聪明地在文件开头添加BOM导致的,而IDEA没有智能的把UTF-8+BOM文件转为普通的UTF-8文件的功能,所以在IDEA中显示的是UTF-8,但是IDEA却不能正确读取.java文件,从而程序出错。

而在VSCode中可以看到通过记事本将ANSI编码格式转换为UTF-8编码格式后,实际是转换为UTF-8 with BOM,这也证明了通过记事本转换编码格式是存在问题的!!!

填坑~解决方案:

1.在编辑器IDEA中将文件编码更改为UTF-16,再改回UTF-8即可,其实就相当于刷新了一下文件编码。

2.直接通过VSCode或者其他可以区分UTF-8和UTF-8 with BOM的编译器(如EditPlus、Notepad++)修改文件编码格式为UTF-8,避免使用记事本(记事本存在编码转换问题!!!)。

java “错误:编码GBK 的不可映射字符”相关推荐

  1. 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案

    基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...

  2. java错误: 编码 GBK 的不可映射字符 (0x9C)

    java错误: 编码 GBK 的不可映射字符 (0x9C) 目录 java错误: 编码 GBK 的不可映射字符 (0x9C) 错误情况示例: 解决办法: 错误情况示例: E:\myJavaCode&g ...

  3. 解决java “错误:编码GBK的不可映射字符 (0xBD)“原创

    public class myname{public static void main(String[] args){System.out.println("小徐爱编程");} } ...

  4. 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 使用 javadoc 命令 , 生成 Java 文档 , 报错 ; javadoc Student.java D:\develop\javadoc& ...

  5. JAVA:错误: 编码GBK的不可映射字符;错误: 找不到或无法加载主类;

    目录 一.编码GBK的不可映射字符: 1.现象 2.解决方法 ANSI:ANSI是什么编码? - malecrab - 博客园 (cnblogs.com) 二.找不到或无法加载主类 一.编码GBK的不 ...

  6. java命令行编译运行遇到java:5: 错误: 编码GBK的不可映射字符 (涓変釜鏋勯?犲嚱鏁?)解决方法

    java命令行编译运行遇到java:5: 错误: 编码GBK的不可映射字符 (涓変釜鏋勯?犲嚱鏁?)解决方法 错误原因:使用简单javac 命令编译java文件,如果代码中存在中文,就算是注释有中文的 ...

  7. 【java】xxxxx.java:5: 错误: 编码 GBK 的不可映射字符_编译问题

    1.出现问题 xxxxx.java:5: 错误: 编码 GBK 的不可映射字符 (0x80) System.out.println("璇疯緭鍏ョ涓?涓拰灏氱殑韬珮锛?"); ...

  8. 错误: 编码GBK的不可映射字符 - Android Studio 生成javadoc文档时报错

    1.运行Tools工具中的Generate JavaDoc报错 想将项目生成一个帮助文档,结果生成doc时(如下图所示), 报下面错误 错误: 编码GBK的不可映射字符//鑾峰彇鍒板緟瑙f瀽鐨勫浘鐗? ...

  9. IDEA Generate JavaDoc时 控制台报错误: 编码GBK的不可映射字符

    一.生成JavaDoc 为了方便查看功能解释,除了使用Swagger-ui以外,还需要知道非控制器(controller)类的功能,比如Service.Resource等.于是尝试了一下IDEA的生成 ...

  10. 错误: 编码GBK的不可映射字符

    错误: 编码GBK的不可映射字符 由于默认字符编码GBK无法映射中文字符,通过cmd进行编译时报错 输入 javac -help 回车,查找帮助信息 查找到帮助信息中参数 -encoding 可以指定 ...

最新文章

  1. 005-算法-分治法
  2. 代码生成工具之Winform查询列表界面生成
  3. springcloud~Eureka实例搭建
  4. JAVA语言异常,Java语言中的异常
  5. 【软件质量】代码评审“亮红灯”的情况
  6. 《深度学习要领》端到端的深度学习技术
  7. .net 考试系统人一多就断开了_【项目】Java在线考试系统
  8. 厦门理工学院android用药软件文献综述,厦门理工学院毕业论文规范.doc
  9. sipp使用过程中报错
  10. 转调小程序(练口琴时用的)
  11. 模板--Guass消元法(求解多元一次方程组)
  12. 盛世乐居回应近期股价波动
  13. win10显示器亮度无法调节
  14. Springboot 整合 阿里云消息队列RabbitMQ版服务
  15. android浏览器固定宽度,Android浏览器宽度拉伸到iframe内容宽度,尽管溢出:隐藏...
  16. SpringCache-redis缓存学习记录
  17. [项目管理]敏捷宣言
  18. CS信号(片选信号)经常都是低电平有效
  19. 联发科有没有高端处理器_联发科官宣,全球第六款7nm处理器来袭,专为游戏而生...
  20. gb和gib的区别_GB和GIB的区别

热门文章

  1. 如何从数据生命周期的角度做好数据资产管理?
  2. 改善二阶系统动态性能的方法
  3. 华中科技大学计算机专硕为啥叫电子信息,华中科技大学电子信息专硕2021年考研经验和复习建议...
  4. 关于Servlet服务器中的 **Caused by: java.lang.IllegalArgumentException: servlet映射中的[servletDemo]无效**
  5. Java selenium 全屏截图和按元素截图介绍
  6. Linux——》Out of memory:kill process
  7. 窄带物联网(NB-IoT)
  8. mamp mysql5.6_MAMP PRO的mySQL启动失败
  9. 魅族mx3升级到android6.0,魅族魅蓝6官方完整版固件系统升级更新包:Flyme 7.3.0.0A...
  10. RTT开发者大会学习