总结下这两天对编码的认识一些认识,本文显得比较啰嗦,应为这是我探讨的整个流程结果,了解的有不对的地方多多指点出来!
不了解的相信你会有个不错的认解,这是我学习编程的一个开始,大家就多多帮村。
在查看网上一些资料时候,首先第一个奇怪的现象出了,据说是移动打不过联通的根本原因。
如果你的电脑操作系统是win2000或winxp的话,那么:
1、在桌面上点右键,选择新建 - 文本文档;
2、打开“新建 文本文档“,录入“移动“两字后存盘退出;
3、重新打开“新建 文本文档“,看到什么了?
4、是不是刚刚录入的“移动“两字?
咱们换过来
1、在桌面上点右键,选择新建 - 文本文档;
2、打开“新建 文本文档“,录入“联通“两字后存盘退出;
3、重新打开“新建 文本文档“,看到什么了?
4、是不是刚刚录入的“联通“两字不见了,取而代之是个烧焦的手机电池的摸样?
呵呵,是不是很有趣,自己试一下,如果重新建个,除了键入“联通”还多敲几个字,“联通”又能正常显示啦。
(以下说的是中文的系统)这个道理还是挺明显的,简单的说文本他本身默认存入编码为GBK,但是“联通”二字的二进制格式跟utf-8编码的格式相同,所以再次打开的时候就是系统用了utf-8的格式去解读了gbk的文本,所以出现乱码。
首先了解下上网了解下so8859-1,GB2312/GBK,unicode,utf-8,utf-16等编码的背景资料以及各自关系。
接下来自己又对了java编程做了些实验,我以“连通”二字做了实验,应为不想对不住联通,“连通”二字解成GBK二进制码后也是符合utf-8编码的二进制码格式。 这个问题晚上查一下一大堆,在这里就不多说了。
接下来是探讨java运行时的编码转换,好,开始建立一个文本,输入“连通”二字,默认保存。
测试程序
- import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.UnsupportedEncodingException;
-
- public class Charset {
- public static void main(String[] str) {
- System.out.println(System.getProperty("file.encoding"));
- FileInputStream fis01;
- FileInputStream fis02;
- FileInputStream fis03;
- InputStreamReader isrUTF8;
- InputStreamReader isrGBK;
- BufferedReader brUTF8;
- BufferedReader brGBK;
- try {
- fis01 = new FileInputStream("E:\\试一下.txt");
- fis02 = new FileInputStream("E:\\试一下.txt");
- fis03 = new FileInputStream("E:\\试一下.txt");
-
- isrGBK = new InputStreamReader(fis02, "GBK");
- isrUTF8 = new InputStreamReader(fis01, "UTF-8");
-
- brGBK = new BufferedReader(isrGBK);
- brUTF8 = new BufferedReader(isrUTF8);
-
- int t = 0;
- String strGBK = brGBK.readLine();
- String strUTF8 = brUTF8.readLine();
-
- System.out.println("GBK的字节-----");
- byte[] b = strGBK.getBytes();
- for (int i = 0; i < b.length; i++) {
- System.out.println(b[i]);
- }
- System.out.println("-----");
-
- System.out.println("utf-8的字节-----");
- byte[] c = strUTF8.getBytes();
- for (int i = 0; i < c.length; i++) {
- System.out.println(c[i]);
- }
- System.out.println("-----");
-
- System.out.println("直接读取的字节-----");
- byte[] y = new byte[b.length];
- int f = fis03.read(y);
- for (int d = 0; d < y.length; d++) {
- System.out.println(y[d]);
- }
- System.out.println("-----");
-
- System.out.println("GBK:" + strGBK);
- System.out.println("UTF-8:" + strUTF8);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
-
- }
-
- }
- }
很简单的一个程序,结果为
GBK
GBK的字节----- -63 -84 -51 -88
-----
utf-8的字节----- 63 63 63
-----
直接读取的字节----- -63 -84 -51 -88
-----
GBK:连通
UTF-8:???
如图运行过程如图:
源代码为本机默认编码(即GBK),在读取二进制后通过,因为在Java 语言默认的编码方式是UNICODE,单我们读取一个文本时,首先读取二进制,通过isrGBK = new InputStreamReader(fis02, "GBK")用GBK编码将二进制码解析成UNICODE编码存在JVM虚拟内存里;当要打印输出,或是获取二进制码时,用byte[] b = strGBK.getBytes()(默认就是byte[] b = strGBK.getBytes(“gbk”)),UNICODE作为内存的与其他外来流的中间者沟通个个编码转换。
如果不指定,就是默认编码就是GBK,一般情况下就是我们存的是“GBK”,读出来的也是“GBK”,所以一般情况下不会出现乱码问题,接下来把上面的文本在保存时指定存为UTF-8时,得到结果为
GBK
GBK的字节-----
-17 -69 -65 -24 -65 -98 -23 -128 63
-----
utf-8的字节----- 63 -63 -84 -51 -88
-----
直接读取的字节----- -17 -69 -65 -24 -65 -98 -23 -128 -102
-----
GBK:锘胯繛閫?
UTF-8:?连通
运行过程:
可以看到,二进制 -17-69-65 这三个是编码标识符,说明这是一个UTF-8编码的文本,用UTF-8解析-24-65-98等于“连”,-23-128-102=“通。
总结就引用一下网上看到的一句话:
事实上,世界上任何东西要与其他东西通信会话,都存在一个既定的协议,既定的编码。人与人之间通过文字联络,汉字“妈”代表生你的那个人,这就是一种既定的编码。但注意到这样一种情况,汉字“妈”在日本文字里有可能是你生下的那个人,所以当一个中国人A与日本B之间用“妈”这个字进行交流,出现误解就很正常的。用记事本打开二进制文件与上面的情况类似。记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应嘛。
杂谈:
由于自己写的还有些地方说得比较模糊,看了别人的文章,写得太好了 http://www.iteye.com/topic/311583内部很清晰,语言精炼标准。
自己代码试出,原来utf-16就是unicode编码,应该是unicode字集开始时候只有unicode编码,但后来出现了utf-8编码,为了名字统一好看,给unicode编码多加了个名字叫utf-16编码。。
接下网上查到:UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题。
自己之前也混淆字符集跟编码两个概念,特地链接过来http://www.iteye.com/topic/317895。
分享到:
相关推荐
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),...
Java中编码总结.pdf
java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.com来解决问题。阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有...
文中部分节选 1.整型实例。 修复建议:使用Integer.valueOf()替代new Integer。 2.switch语句包含太少分支。 修复建议:分支比较少的时候建议使用if else。原因:switch用来处理多分支的情况。...
此文档为Java中编码方式和Unicode知识总结,对了解学习Java编码的讲解很全面清楚!
最近在做一个java生成图片的功能,由于系统字体原因,在linux上生成出来的中文是乱码,所以在网上找了N多的资料,最终才把问题解决。很多人说把字体放到jdk安装目录下的Jre的fonts目录下,根本是无效的。且Centos6和...
改文档详细总结了JAVA开发中的各种常见的中文乱码,比如JSP页面的中文乱码,数据库的中文乱码等。
Java编码规范 java编码的经验总结
当你编写代码时是不是也遇到了乱码问题 尤其是jquery post提交 来下载看看吧 你会有所收获 (个人总结 针对不同情况)
NULL 博文链接:https://lhc1986.iteye.com/blog/1544701
JAVA编码问题的总结,详细解析JAVA编码机制和各种相关问题
Java中编码以及Unicode总结
1,我不要自我重复: 这也许是在编程开发这最最基本的一个信条,就是要告诉你...一旦程序里开始有重复现象的出现(例如很长的表达式、一大堆的语句,但都是为了表达相同的概念),你就需要对代码进行一次新的提炼,抽象。
解决在javaweb开发的过程中遇到的乱码问题,纯属个人在学习中的总结。
Java中编码总结[整理].pdf
解决乱码的各种方法总结,包括数据库的解决方案,个人觉得比较详细有使用价值
这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
个人的一点关于JAVA乱码的整理。不知对大家有没有用
Java Web 总结 Java Web 应用程序是基于 Java 语言和 Web 技术的应用程序,它们可以运行在 Web 服务器上,为用户提供各种服务。Java Web 应用程序的核心技术是 Servlet 和 JavaServer Pages(JSP),它们是 Java ...
根据自己平时遇到的问题,以及根据资源,总结出了所有中文乱码问题,包括乱码问题的方式,分析乱码原因,以及给出几种乱码解决办法,基本上解决所有乱码问题,简单易懂,有截图。