【编码】字符集与编码意义与关系、java编程编码问题相关学习笔记

来源:互联网 发布:淘宝号怎么升级快 编辑:程序博客网 时间:2024/05/22 00:57

本文对字符集与编码的定义、java编程中遇到的编码问题排查方案等进行相关的小总结;

一、字符集与编码方式

(1)字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等;
(2)字符编码:将符号转换为计算机可以接受的数字系统的数,成为数字代码;
(3)乱码:在解码的过程中使用了错误的解码规则,即编码与解码的方式不一致,导致解码出现的字符不正确;

之前一直纠结于字符集与编码方式到底有何区别,但经过一番阅读后,发现,字符集与编码方式不能完全分开来谈,字符集包括各个国家的文字、标点符号、数字、图形符号等等,是计算机存储的信息展示在我们眼前的样子,但是,众所周知,计算机的信息都是采用二进制数来存储的,那么我们如何来看到这些字符,以及这些字符是如何存储在计算机中的,都对应着“解码”、与“编码”的过程;即字符需要编码从而使用二进制数存储在计算机中,而信息需要解码才能以字符的方式展现在我们眼前,即通过计算机屏幕显示出来;每一种编码方式都对应一种字符集;而每一种字符集又可采用一种或多种编码方式进行编码、解码;
如ASCII编码是将字符集转换为计算机可接受的数字系统的数的规则;
又如GBXXXX编码是将GBXXXX字符集转换为二进制的规则;
utf-8 utf-16 utf-32等都是将unicode字符集转换为二进制的不同的规则;
等等;

二、编码转换发生

(1)编码转换的发生
对于Java程序来说,一个字符分为两个部分:JVM内部和OS的文件系统。在JVM内部,统一使用Unicode表示,当这个字符被从JVM内部移到外部(即保存为文件系统的一个文件的内容、保存到数据库)时,或者说字符被从文件读入到JVM内部,就进行了编码转换,使用了具体的编码方案,默认采用系统的编码。因此可以说,所有的编码只发生在边界的地方,JVM和OS的交界处,也就是各种输入/输出流起作用的地方。Java的IO系统中能够指定转换编码的地方,就在字符与字节转换的地方,那就是InputStreamReader和OutputStreamWriter,这两个类是字节流和字符流之间的适配器类,他们承担编码转换的任务;否则使用系统默认字符集于编码方式;
如下:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(""),"utf-8"));

(2)编码转换过程可能出现问题的地方
编码转换发生在IO的过程中,那么乱码的产生则意味着IO的两端所使用的编码与解码的方式不一致,导致乱码的出现,因此只要我们保证IO两端编码方式一致,则可避免乱码问题;
从Java源代码到得到正确的结果,要经过以下几个步骤:

    .java文件代表的源代码(该文件的编码方式,IDE编程时,可以用IDE进行设置,可以通过System.getProperty(file.encoding”)输出查看)    —>编译(默认采用系统编码,应当与.java文件的编码方式保持一致,可以通过javac 命令参数-encoding设置)    —>.class文件代表的Java字节码(Unicode编码方式)    —>JVM虚拟机(即虚拟机启动采用的字符集,默认采用系统编码,可以通过Java启动参数-Dfile.endofing设置)    —>操作系统(系统的编码方式)    —>显示设备(例如控制台、浏览器等等)/存储设备(文件系统、数据库等等)

在上述过程中的每一个步骤,我们都必须正确处理中文编码,才能够使得最终显示正确的结果;

当编程过程中出现中文乱码问题,可以通过分析上述过程,是哪一个过程所采用的编码方式错误而导致的乱码问题;

三、java编程乱码问题简单分析

以下问题(除1之外),为java编码过程中出现的乱码问题,可以分析出,都是发生在IO过程中,即我们上边提到的,只有在IO的过程中才会发生编码转换;因此只需要分析IO两端的编码是否一致即可;分析InputStreamReader的构造显示设置的编码(若没有显示设置,则为系统默认编码)与IO另一端编码是否一致

(1)IDE打开.java文件,中文出现乱码
着意味着IDE打开文件所使用的编码方式与文件本身的编码方式不一致,需要修改IDE的编码方式;

(2)java程序控制台输出/浏览器显示,中文出现乱码
检查上述过程中的编码是否一致;编译以及JVM启动所使用编码是否不一致,若他们都是采用系统默认编码,那么编译与运行使用的机器是否默认编码不一致;再者,显示设备使用的编码与JVM运行的编码不一致,例如浏览器的编码设置等等;可以从上述方面进行检查;

(3)java中文保存到文件,出现乱码
IO发生的过程,IO两端编码不一致造成;若在IO过程中,没有显士设置编码,则意味着系统编码与文件编码方式不一致,导致打开文件出现了乱码;
若显士设置了编码,则意味着编码设置错误;

(4)JDBC中文保存到数据库出现乱码
与上述同理,只不过此时IO输出端变成了数据库,此时应当检查数据库系统的编码与JVM启动所采用编码、显士设置的编码是否一致;

(5)网络资源/本地文件资源获取,中文出现乱码
从网络或者本地文件读取的资源,从字节转换成字符时,可以显示设置编码,说明,这里的设置出现了问题;
(6)在一台机器上编译,在另一台机器运行,中文出现乱码
参考博客【转】准确设置-Dfile.encoding参数IT知识问答希赛网
编译和JVM启动所采用的编码不一致

0 0
原创粉丝点击