java基础 — java中字符编码问题

文件的编码格式

一、关于中文的二进制字节问题

public static String CHARSET_TEXT = "我爱LL";
// 打印字节的16进制表示
private void printBinarys(byte[] buffer) {
    
    
    for (byte b : buffer) {
    
    
        System.out.print(Integer.toHexString(b & 0xff) + " ");
    }
    System.out.println();
}
    @Test
public void charset_1() throws Exception {
    
    
    /**
     * utf-8是一个中文三个字节,gbk是一个中文两个字节
     */
    printBinarys(CHARSET_TEXT.getBytes()); // e6 88 91 e7 88 b1 4c 4c
    printBinarys(CHARSET_TEXT.getBytes("utf-8")); // e6 88 91 e7 88 b1 4c 4c
    printBinarys(CHARSET_TEXT.getBytes("gbk")); // ce d2 b0 ae 4c 4c
    printBinarys(CHARSET_TEXT.getBytes("iso-8859-1")); // 3f 3f 4c 4c
}

二、字符的编码与解码方式

private void printStringByCharset(byte[] buffer, String charsetName) throws UnsupportedEncodingException {
    
    
    System.out.println(new String(buffer, charsetName));
}//需要获取资料的朋友请加Q君样:290194256*

@Test
public void charset_2() throws Exception {
    
    
    /**
     * 1、CHARSET_TEXT.getBytes("utf-8"):返回的是e6 88 91 e7 88 b1 4c 4c。说明CHARSET_TEXT以utf-8编码成e6 88 91 e7 88 b1 4c 4c
     * 2、new String(buffer, charsetName):对e6 88 91 e7 88 b1 4c 4c以utf-8的方式解码。得到的是CHARSET_TEXT,所以没有乱码。
     * 3、至于iso-8859-1的乱码:
     */
    printStringByCharset(CHARSET_TEXT.getBytes(), "utf-8"); // 我爱LL
    printStringByCharset(CHARSET_TEXT.getBytes("utf-8"), "utf-8"); // 我爱LL
    printStringByCharset(CHARSET_TEXT.getBytes("gbk"), "utf-8"); // �Ұ�LL
    printStringByCharset(CHARSET_TEXT.getBytes("iso-8859-1"), "iso-8859-1"); // ??LL
    printStringByCharset(CHARSET_TEXT.getBytes("iso-8859-1"), "utf-8"); // ??LL
}

三、关于文件的编码与读取文件的内容

需要注意的是:文件是以二进制字节的方式存储的。

public static String FILE_PATH = "C:/Users/76801/Desktop/charset/huhx.txt";
public static String FILENAME_PATH = "C:/Users/76801/Desktop/charset/linux.txt";
// 读取文件内容成二进制数组
private void printBinaryFromFile(String filePath, String charsetName) {
    
    
    File file = new File(filePath);
    try {
    
    
        InputStream stream = new FileInputStream(file);
        byte[] buffers = new byte[stream.available()];
        stream.read(buffers);
        stream.close();
        printStringByCharset(buffers, charsetName);
    } catch (Exception e) {
    
    
        e.printStackTrace();
    }
}//需要获取资料的朋友请加Q君样:290194256*

@Test
public void charset_3() throws Exception{
    
    
    // 文件的编码是utf-8无DOM
    printBinaryFromFile(FILE_PATH, "UTF-8"); // I love you,中国。
    printBinaryFromFile(FILE_PATH, "GBK"); // I love you,涓浗銆�
// 转换成gbk2312,编辑器显示的内容:I love you,涓浗銆。但是删除内容,自己重新输入不会出现乱码。这时候,其实是改变了真实的内容。切换编码,并没有改变真实的内容。 
    printStringByCharset("I love you,中国。".getBytes("utf-8"), "gbk"); // I love you,涓浗銆�
    /**
     * 1、一个文件的内容先以utf-8编码写入内容:I love you,L玲。
     * 2、改变它的编码为gbk内容显示:I love you,L鐜层€
     * 3、在下述的测试中,正常显示。据此我们知道,这个文件的保存的二进制是utf-8编码:49 20 6c 6f 76 65 20 79 6f 75 2c 4c e7 8e b2 e3 80 82
     * 4、改变它的编码格式,notepad++并没有改变它本身的二进制内容。只是显示的机制是以gbk对49 20 6c 6f 76 65 20 79 6f 75 2c 4c e7 8e b2 e3 80 82进行解码。
     */
    printBinarys("I love you,L玲。".getBytes("utf-8")); // 49 20 6c 6f 76 65 20 79 6f 75 2c 4c e7 8e b2 e3 80 82
    printStringByCharset("I love you,L玲。".getBytes("utf-8"), "gbk"); // I love you,L鐜层��
    printBinaryFromFile(FILENAME_PATH, "UTF-8"); // I love you,L玲。
}

演示的动态图如下:
在这里插入图片描述
三、eclipse中的编码设置影响java的默认编码
此时项目的编码是UTF-8,FirstJava.java文件的编码是ISO-8859-1,SecondJava.java文件的编码是UTF-8。
在这里插入图片描述
下面是测试的代码:

public class FirstJava {
    
    
    public static void main(String[] args) {
    
    
        String charsetName = Charset.defaultCharset().displayName(); // ISO-8859-1
        System.out.println(charsetName);
    }
}//需要获取资料的朋友请加Q君样:290194256*

public class SecondJava {
    
    
    public static void main(String[] args) {
    
    
        String charsetName = Charset.defaultCharset().displayName(); // UTF-8
        System.out.println(charsetName);
    }
}

在FirstJava中,如果文件包含了中文。保存文件的时候会有如下的错误。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:290194256*

猜你喜欢

转载自blog.csdn.net/weixin_53341657/article/details/112912633