文件的编码格式
一、关于中文的二进制字节问题
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中,如果文件包含了中文。保存文件的时候会有如下的错误。