标签:eset jdb hue spn atm gad extc drm bwt
这里面对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玲。 }
演示的动态图如下:
此时项目的编码是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中,如果文件包含了中文。保存文件的时候会有如下的错误。
标签:eset jdb hue spn atm gad extc drm bwt
原文地址:http://www.cnblogs.com/huhx/p/baseusejavacharset1.html