一、概要
在JAVA应用程序特别是基于WEB的程序中,经常遇到字符的编码问题。为了防止出现乱码,首先需要了解JAVA是如何处理字符的,这样就可以有目的地在输入/输出环节中增加必要的转码。其次,由于各种服务器有不同的处理方式,还需要多做试验,确保使用中不出现乱码。
二、基本概念
2.1 JAVA中字符的表达
JAVA中有char、byte、String这几个概念。char 指的是一个UNICODE字符,为16位的整数。byte 是字节,字符串在网络传输或存储前需要转换为byte数组。在从网络接收或从存储设备读取后需要将byte数组转换成String。String是字符串,可以看成是由char组成的数组。String 和 char 为内存形式,byte是网络传输或存储的序列化形式。
举例:
英
String ying = “英”;
char ying = ying.charAt(0);
String yingHex = Integer.toHexString(ying);
82 F1
byte yingGBBytes = ying.getBytes(“GBK”);
GB编码的字节数值
D3 A2
2.2 编码方式的简介
String序列化成byte数组或反序列化时需要选择正确的编码方式。如果编码方式不正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
ISO8859_1用来编码拉丁文,它由单字节(0-255)组成。
GB2312、GBK用来编码简体中文,它有单字节和双字节混合组成。最高位为1的字节和下一个字节构成一个汉字,最高位为0的字节是ASCII码。
UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。 用得最多的是UTF-8,主要是因为它在对拉丁文编码时节约空间。
UNICODE值 UTF-8编码
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
三、J2SE中相关的函数
String str =”英”;
//取得GB2312编码的字节
byte[] bytesGB2312 = str.getBytes(“GB2312”);
//取得平台缺省编码的字节(solaris为ISO8859_1,windows为GB2312)
byte[] bytesDefault = str.getBytes();
//用指定的编码将字节转换成字符串
String newStrGB = new String(bytesGB2312, “GB2312”);
//用平台缺省的编码将字节转换成字符串(solaris为ISO8859_1,windows为GB2312)
String newStrDefault = new String(bytesDefault);
//用指定的编码从字节流里面读取字符
InputStream in = xxx;
InputStreamReader reader = InputStreamReader( in, “GB2312”);
char aChar = reader.read();
四、JSP、数据库的编码
4.1 JSP中的编码
(1) 静态声明:
CHARSET有两个作用:
JSP文件的编码方式:在读取JSP文件、生成JAVA类时,源JSP文件中汉字的编码
JSP输出流的编码方式:在执行JSP时,往response流里面写入数据的编码方式
(2) 动态改变:在往response流里面写数据前可以调用response.setContentType(),设定正确的编码类型。
(3) 在TOMCAT中,由Request.getParameter() 得到的参数,编码方式都是ISO8859_1。所以如果在浏览器输入框内输入一个汉字“英”,在服务器端就得到一个ISO8859_1编码的(0x00,0xD3,0x00,0xA2)。所以通常在接收参数时转码:
String wrongStr = response.getParameter(“name”);
String correctStr = new String(wrongStr.getBytes(“ISO8859_1”),”GB2312”);
在最新的SERVLET规范里面,也可以在获取参数之前执行如下代码:
request.setCharacterEncoding(“GB2312”);
4.2 数据库的编码
(1) 数据库使用UTF-16
如果String中是UNICODE字符,写入读出时不需要转码
(2) 数据库使用ISO8859_1
如果String中是UNICODE字符,写入读出时需要转码
写入:String newStr = new String(oldStr.getByte(“GB2312”), “ISO8859_1”);
读出:String newStr = new String(oldStr.getByte(“ISO8859_1”),”GB2312”);
五、源文件的编码
5.1 资源文件
资源文件的编码方式和编辑平台相关。在WINDOWS平台下编写的资源文件,以GB2312方式编码。在编译时需要转码,以确保在各个平台上的正确性:
native2ascii ?encoding GB2312 source.properties
这样从资源文件中读出的就是正确的UNICODE字符串。
5.2 源文件
源文件的编码方式和编辑平台相关。在WINDOWS平台下开发的源文件,以GB2312方式编码。在编译的时候,需要指定源文件的编码方式:
javac ?encoding GB2312
JAVA编译后生成的字节文件的编码为UTF-8。
发表评论
-
从数据库结果集查找树的根节点
2009-08-14 11:26 1566由于在查询出的每条记录里,都有unit_id和par_unit ... -
获取当前应用的相对路径
2009-08-07 13:56 1268public String getApplicatio ... -
Quartz + Spring 实现定时任务配置2
2009-08-06 14:12 849<beans> <!-- 定时服务定义 -- ... -
Quartz + Spring 实现定时任务配置1
2009-08-06 12:02 986<beans> <!-- 任务调度对象 -- ... -
tomcat组件分解
2009-06-10 13:38 912<!-- tomcat顶层容器 ... -
Commons Logging 的使用方法
2009-06-10 10:13 2043应用程序中使用好日志 ... -
RuntimeException和非RuntimeException
2009-04-25 11:24 1631在java的异常类体系中,Error和RuntimeExcep ... -
GB2312,GBK,UTF-8的关系
2009-04-05 11:03 13271,GBK编码兼容GB2312. 详细点 ... -
使用Spring、Hibernate、Struts的一些错误总结
2009-01-14 10:24 1021使用Spring、Hibernate、St ... -
Hibernate 体系结构与工作原理
2009-01-14 10:14 810... -
Servlet中listener的应用
2009-01-14 10:03 740由于工作需要,最近在找一些解决方案,发现Listener是一个 ... -
(引用)JVM调优总结 -Xms -Xmx -Xmn -Xss
2009-01-14 09:49 831三、常见配置举例 堆大小设置JVM 中最大堆大小有三方 ... -
关键字: 显示 Hibernate SQL 语句中 ? 的值
2009-01-14 09:35 834Java代码 <?xml v ... -
Apache开源项目分类列表
2009-01-14 09:13 1049查看文章 ... -
使用import简化spring的配置文件
2009-01-14 08:49 841在多个人做同一 ... -
jsp输出js特殊字符替换
2009-01-12 17:23 2280运行: "\n\twomen'".repl ... -
java内存分配研究
2009-01-04 11:12 1025java内存分配研究 今天看了一下java的内存分配,分享 ...
相关推荐
在开发web中各种解决字符集编码的方法和例子,供大家参考
计算机只能以字节为单位存储和传输信息,而人需要看的是字符串...不同的字符集映射规则不一样,能表示的范围也不一样,例如“中”在GB2312中对应的字节表示为:D6 D0 两个字节,字符和字节之间的转换,描述为编码和解码
关于applicationx-www-form-urlencoded等字符编码的解释说明,挺有用的,如果你开发Restful Web service。
在java web开发中,处理中文字符时经常会出现乱码问题。该文从java Web工程字符编码理论出发,介绍了java Web程序开发中常用的字符编码集,分析出现中文乱码的原因,并给出解决方法。
在java web开发中,处理中文字符时经常会出现乱码问题。该文从java Web工程字符编码理论出发,介绍了java Web程序开发中常用的字符编码集,分析出现中文乱码的原因,并给出解决方法。
在Java Web程序开发中,由于...在实际的开发过程中,如果通过每一个业务处理指定中文字符集编码,则操作过于繁琐,而且容易遗漏某一个业务中的字符编码设置;如果通过过滤器来处理字符编码,就可以做到简单又万无一失。
《php和mysql web开发(原书第4版)》:开发人员专业技术丛书。 目录 读者反馈 译者序 前言 作者简介 第一篇 使用PHP 第1章 PHP快速入门教程 1.1 开始之前:了解PHP 1.2 创建一个示例应用:Bob汽车零部件商店 ...
web开发常用jar包 常用jar包 commons-beanutils.jar Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。 commons-collections.jar Apache Commons包中的一个,包含了一些Apache开发的集合类,...
JAVA字符串操作类CTool.java字符转换类,此类中收集Java编程中WEB开发常用到的一些工具。为避免生成此类的实例,构造方法被申明为private类型的。封装的功能:字符串从GBK编码转换为Unicode编码、对字符串进行md5...
提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例...
4.5.1 在字符串中查找字符串:strstr()、strchr()、strrchr()和stristr() 4.5.2 查找子字符串的位置:strpos()、strrpos() 4.5.3 替换子字符串:str_replace()、substr_replace() 4.6 正则表达式的介绍 4.6.1 基础...
从介绍java常用字符编码集入手,详细分析了在java Web开发中产生中文乱码的原因,并针对原因提出了可行性解决方法。
9.4.4 字符串处理 226 9.4.5 复杂类型 226 9.5 PHP的自动建造系统 226 9.6 创建扩充 228 9.7 编辑模块 229 9.7.1 编辑使用Make 229 9.7.2 手工编辑 229 9.8 使用扩充 230 9.9 故障处理 231 9.10 源代码讨论 231 ...
提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例和4...
67前端开发基础视频-CSS特殊性即CSS优先级(中).avi 68前端开发基础视频-CSS特殊性即CSS优先级(下).avi 69前端开发基础视频-CSS设置标签模式display属性介绍.avi 70前端开发基础视频-CSS设置标签模式display...
3.提供编码多种字符集选择 4.采用统一编码接口 5.提供两种常用编码方式 5.1通过内容大小决定条码图像区域 5.2根据编码图像区域,条码自动适配大小 6.提供客户程序和WEB端应用程序开发案例,可以快速实现条码...
1.5. XML编码规范 11 1.6. 程序注释 12 1.6.1. 程序头注释 12 1.6.2. 关键变量注释 12 1.6.3. 关键算法注释 12 1.6.4. 函数注释 13 1.7. 对象管理 13 1.7.1. 对象释放 13 1.7.2. 对象引用 14 2. 设计规范 ...
这个类的功能可实现将数据从数据库中取出后转换、字符编码转换、大文本块处理(将字符集转成ISO)、字符类型转换,比如将String型变量转换成int型变量等操作,在实际应用中,这是个相当实用的字符串操作类。
《php和mysql web开发(原书第4版)》:开发人员专业技术丛书。 目录 读者反馈 译者序 前言 作者简介 第一篇 使用PHP 第1章 PHP快速入门教程 1.1 开始之前:了解PHP 1.2 创建一个示例应用:Bob汽车零部件商店 ...
3,数据库字符编码与本地字符编码转换; 4,文件上传,上传大小控制; 5,文件下载,下载记数; 6,图片显示; 7,数据分页显示; 8,客户端标记记录集哪条记录被选择; newxy(新坐标)技术网站:...