zoukankan      html  css  js  c++  java
  • Java文件编译出现 “编码 GBK 的不可映射字符”

    俗话说,温故而知新。本打算用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很少用记事本,基础不牢靠啊。回忆了编码的知识,也是值得的。

  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/8314790.html
Copyright © 2011-2022 走看看