编码与控制台
String s1 = FileUtils.readPackageResourceToString("co/common/util/iso8859.html",null,"iso-8859-1");
String s2 = FileUtils.readPackageResourceToString("co/common/util/utf8.html",null,"utf-8");String s3 = FileUtils.readPackageResourceToString("co/common/util/gbk.html",null,"gbk");// you should change the console's encoding to utf-8// System.out.println(new String(s1.getBytes("utf-8")));// System.out.println(new String(s2.getBytes("utf-8")));// System.out.println(new String(s3.getBytes("utf-8")));//byte[] cs = s2.getBytes();//错的byte[] cs1 = new String(s2.getBytes("utf-8")).getBytes();//对的byte[] cs2 = new String(s2.getBytes("utf-8"),"utf-8").getBytes();//错的byte[] cs3 = s2.getBytes("utf-8");//对的byte[] cs4 = new String(s2.getBytes("utf-8"),"cp1252").getBytes(); //对的,与二相同System.out.println("====s2.getBytes()=======");for (int i = 0 ; i < cs.length ; i++){System.out.println(cs[i]);}System.out.println("====new String(s2.getBytes(\"utf-8\"),\"utf-8\").getBytes();=======");for (int i = 0 ; i < cs1.length ; i++){System.out.println(cs1[i]);}System.out.println("====new String(s2.getBytes(\"utf-8\"),\"utf-8\").getBytes()=======");for (int i = 0 ; i < cs2.length ; i++){System.out.println(cs2[i]);}System.out.println("====s2.getBytes(\"utf-8\");=======");for (int i = 0 ; i < cs3.length ; i++){System.out.println(cs3[i]);}System.out.println("====new String(s2.getBytes(\"utf-8\"),\"cp1252\").getBytes()=======");for (int i = 0 ; i < cs4.length ; i++){System.out.println(cs4[i]);}// System.out.println(s2);// System.out.println(new String(s2.getBytes("utf-8"),"utf-8"));// System.out.println(new String(s2.getBytes()));// System.out.println(new String(s2.getBytes(),"utf-8"));}catch (IOException e){e.printStackTrace();fail();}
String.getBytes(encoding) 是将字符串编码到指定格式
Charset 和 Encoding 的区别是什么?
在绝大多数情况下,包括某些专业文章中,字符集和编码都统称为编码,这是因为一个字符集往往对应一种编码。但是在程序中,我们来不得半点马虎,我们 应该清楚地知道字符集和编码有什么区别。以 ASP.NET 为例,Response.Charset 和 Response.Output.Encoding(只读)中的 Charset 和 Encoding 有什么区别呢?
Charset 是字符集,Encoding 是编码。
- 字符集即字符的集合,规定了在这些集合里面有哪些字符,每一个字符都有一个编号(一个整数),但这只是编号 不是编码。
- 编码就规定了一个编号如何与二进制交互。
我们大多数人最先接触到的字符集是 1963 年的 ASCII,其中的每一个字符只需要用一个字节来表示就可以了。但世界上有许多种语言,像亚洲文字,比如中文,常用汉字就几千个,仅用一个字节来表示显然 是不够的,假如我们使用两个字节。
那么问题就来了,为什么我们要把两个字节看成是一个汉字的编号呢?为什么我们不把两个字节看成 ASCII 字符集的两个编号呢?为了解决此问题,就得使用编码来标识了。
还有一个问题,编号(整数)1234 在字符集 A 中代表“千”,1234 在字符集 B 中代表“一”,那么 1234 究竟代表什么字呢?这就得明确字符集了。
浏览器可以自动识别使用哪个字符集,一般说来它们使用 HTTP 头部的 Content-Type 标明的字符集,如果没有向 HTTP 头部发送该信息,一般参考使用 HTML 的 head 标签中的 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />,为什么是参考使用呢?因为现在浏览器都比较聪明,如果发现这里用错了,一般会给予纠正。
我们做网页时,如果指定的 Charset 是 GB2312,那么就不应该在网页中出现繁体字,因为 GB2312 标准只有几千个简体的中文字。如果我们的网页编码是 UTF-8,我们就不要指定字符集是 GB2312,因为虽然 UTF-8 编码对应的 UTF-8 字符集包含了 GB2312 的字符,但同一个字符在两个字符集中的编号不一样。
对于我们中文简体网页,一般来说有两种搭配:
- 一种是字符集是 GB2312,编码使用 ANSI。占用磁盘空间最少,网络传输效率最高。
- 一种是字符集是 UTF-8,编码使用 UTF-8。虽然占用磁盘空间大,传输效率略低,但因为兼容面广,在应用 Ajax 以及包含多种语言文字时使用方便。鉴于此原因,现在许多网页开发工具都默认使用 UTF-8 来保存网页,比如 Visual Web Developer。