全屏浏览
缩小浏览
回到页首

java基础---->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));
}
@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();
    }
}

@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);
    }
}

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

 在FirstJava中,如果文件包含了中文。保存文件的时候会有如下的错误。

 

友情链接

 

posted @ 2017-07-27 14:51  huhx  阅读(719)  评论(0编辑  收藏  举报