博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java文件编译出现 “编码 GBK 的不可映射字符”
阅读量:5243 次
发布时间:2019-06-14

本文共 3802 字,大约阅读时间需要 12 分钟。

俗话说,温故而知新。本打算用dos回忆一下基础知识,没想到把自己绊倒了。

用Dos,当然就要回归原始,用记事本啦。下面用一个小练习,演示我遇到的绊脚石。之后,解决了简直笑死。

报错:

Java文件编译出现“编码 GBK 的不可映射字符”

(下图不是我的,我的忘记截图了。但是为了方便演示,我在网上找了相同问题的图片,之后的图都是我自己截我自己的了)

在notepad++里面的代码是在Myeclipse里面粘贴过来的,运行过的。

代码实例:

import java.io.BufferedReader;import java.io.InputStreamReader;public class Demo6 {    /*     * @param args     *      * @在记事本中验证 测试好用     *      * @author 周周     *      * @version 1.1     */    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        // 定义一个可以存放四只狗的对象数组        DogNew dogs[] = new DogNew[4];        // 从控制台输入各个狗的信息        InputStreamReader isr = new InputStreamReader(System.in);        BufferedReader br = new BufferedReader(isr);        for (int i = 0; i < 4; i++) {            dogs[i] = new DogNew();            System.out.println("请输入第" + (i + 1) + "只狗的名字");            // 从控制台读取狗名            String name = br.readLine();            // 将名字赋给对象            dogs[i].setName(name);            System.out.println("请输入第" + (i + 1) + "只狗的体重");            String s_weight = br.readLine();            // 只要编译器看到readLine,程序就会停在那里等你输入,你不输入它不往下进行            // 但是,readLine读进来之后总是一个字符串,依照要求,需要自己强转一下            float weight = Float.parseFloat(s_weight);            // 将名字赋给对象            dogs[i].setWeight(weight);        }        // 计算总体重        float allWeight = 0;        for (int i = 0; i < 4; i++) {            allWeight += dogs[i].getWeight();// getWeight()指取出对应狗的体重。把它累计给allWeight这个变量        }        // 计算平均体重        float avgWeight = allWeight / dogs.length;// 这里没有除以4.而是直接计算出对象数组的大小了        System.out.println("总体重:" + allWeight + "   平均体重:" + avgWeight);        // 找出体重最大的狗        // 假设 第一只狗体重最大        float maxWeight = dogs[0].getWeight();        int maxIndex = 0;        // 按顺序和后面的狗比较        for (int i = 1; i < dogs.length; i++) {            if (maxWeight < dogs[i].getWeight()) {                // 修改                maxWeight = dogs[i].getWeight();                maxIndex = i;            }        }        System.out.println("体重最大的狗是第" + (maxIndex + 1) + "     体重是"                + dogs[maxIndex].getWeight());    }}// 定义一个狗类class DogNew {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public float getWeight() {        return weight;    }    public void setWeight(float weight) {        this.weight = weight;    }    private float weight;}

报错(这个报错你可能没出现,我自己记录一下,总马虎):

The   type   Dog    is   already defined

这个好解决:

1.点击->project->clean(将你的工程文件清理一下)

2.查看包里面是不是还有其他的类名实和这个定义的类名相同,或者是其他类中定义了和这个类名一样了,删除一个,或者改名。是我之前创建过Dog类,这里再用相同类名就不行了。上面代码Dog类,改成了DogNew类。OK

之后,有报错:

编码utf-8的不可映射字符(0xAB)

知道是编码问题,上网搜答案一大堆。

了解一下问题出现的原因:

由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK)。

然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中。紧接着,JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。

对我们来说,我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件,它内部包含我们源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为UNICODE格式了。当我们不加设置就编译时,相当于使用了参数:javac -encoding gbk XX.java,当然就会出现不兼容的情况。

可按一下步骤逐一排除:

方法一:

把源文件编码修改成ASCII

1)英文版notepad++

菜单:Configure --> Options --> JDK Tools --> Compiler

1)中文版 notepad++

菜单:设置→首选项→新建,选择编码方式为ANSI.

 在这里也进行修改

编码 --->以ANSI格式编码

 

方法二:

使用-encoding 指定字符集

javac -encoding utf-8 xxxxx.java

报错:

notepad++里面的代码,出现中文不兼容(中文会有红色下划线提示)

 

了解一下问题出现的原因:

Notepad有不少的插件,这个是拼写错误提示的插件,一般我们不会想要它。里面的错误一般是为了检测英文的拼写错误,中文的注释它就认为是错误的,出现大量的红色下划线。

解决方法:

1.菜单栏 —- 插件 —- DSpellCheck ——Spell Check Document Automatically,点击即可。

2.点击右上角图标,即可。(与上面效果相同)

最后,用Dos运行了这个小练习。有了IDE很少用记事本,基础不牢靠啊。回忆了编码的知识,也是值得的。

转载于:https://www.cnblogs.com/1693977889zz/p/8314790.html

你可能感兴趣的文章
Problem B: 占点游戏
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
BNU29140——Taiko taiko——————【概率题、规律题】
查看>>
POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】
查看>>
java 得到以后的日期
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
python安装easy_intall和pip
查看>>
HDU1004
查看>>
MySQL高速缓存
查看>>
DropdownList绑定的两种方法
查看>>
价值观
查看>>
数值计算中,浮点类型给我们挖的坑
查看>>
(String)、toString、String.valueOf
查看>>
mongodb命令----批量更改文档字段名
查看>>
python多线程下载网页图片并保存至特定目录
查看>>
了解循环队列的实现
查看>>
CentOS 简单命令
查看>>