- 浏览: 118900 次
- 性别:
- 来自: 东莞
文章分类
最新评论
-
xianzi_2008:
spring-config.xml是什么啊
使用Spring Mock测试Action中的方法 -
品信Q88:
独立网店的迅速发展已经成为中国电子商务发展道路上不可阻挡的趋势 ...
独立网店有什么好处,独立网店好还是淘宝网店拍拍网店好 -
Javakeith:
不说文章怎么样!我怎么看百度 心里就来气呢!
Powerdesigner连接Mysql数据库配置图解
java在线中文API:http://doc.java.sun.com/DocWeb/
两种解决URL传输中文的方法:
1.在tomcat的server.xml文件中加URIEncoding="gb2312"
2.在传输前对中文进行编码,在处理时再反编码
java.net.URLEncoder.encode(name,"UTF-8");
java.net.URLDecoder.decode(name, "UTF-8");
个人推荐使用第二种。
编码转换:new String(name1.toString().getBytes("ISO-8859-1"),"GBK");ISO-8859-1转换为GBK
以下为编码详细说明:
Java标准字符集
所谓Java标准字符集,就是Java平台支持的字符集:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16。你应该比较熟悉前面三种字符集,后面三种字符集你应该了解得比较少,也很难会用到,不过我还是会在后面的文章中提到这些概念。另外,你应该注意到,Java并不支持我们常用的中文字符集GB2312、GBK等,我想是因为中文字符集没有通用性,并且Unicode也能很好的支持中文字符集,所以就没必要将中文字符集作为标准字符集定义。下面,我们就每种自己的概念和关联进行介绍;当然,重点会是中文字符集和Unicode。
US-ASCII
你还依稀记得C语言支持的字符编码格式吗?使用的就是US-ASCII,这是一个出现得比较早的字符编码规范;因为它出现比较早,在通用型方面也考虑得比较少,所以也比较简单。一个ASCII字符用一个字节存储,也就是说它可以用来表示256个不同的字符。由于英文大小写字母、阿拉伯数字和标点符号等字符是有限的,所以就把前128个字符作为常用字符,而剩下的高位字符作为扩展字符。这128个字符通常用来表示音标、特殊字符等。
ISO-8859-1
ISO-8859-1也常被称为Latin_1(拉丁1)字符集,像MySQL的默认字符集就是ISO-8859-1,其他它与ASCII编码类似,也是用一个字节表示一个字符,也只用于表示英文字符、数字、符号及特殊字符。它与ASCII唯一的不同在于它是一个国际标准,而ASCII只是一个美国国家标准。对该标准更详细的信息可以参考下面一篇文档:
http://download1.csdn.net/down3/20070617/17001523603.pdf
中文字符集
通过对上面两种字符集的了解,如果想用它们来表示中文字符集,显然有些不太现实,因为常用的中文字符都有上千个之多,所以我们需要能表示更多字符的字符集实现中文字符编码。但又为了兼容ASCII编码,中国在ASCII的基础上制定了自己的字符编码规范,也就是我们比较熟悉的GB2312,它的全称是GB2312-80信息交换用汉字编码字符集(基础集)。它能定义了7000多个常用汉字和符号,GB2312的实现是通过使用两个扩展ASCII字符来定义一个中文字符,根据这一特定,我们就可以判断相邻的两个ASCII字符是否为扩展字符,我们就可以确认这两个字符组成一个中文字符,但是在扩展ASCII字符中,也定义了一些其他字符,所以相邻两个ASCII同为扩展字符时,并不能肯定的说它是一个中文字符,处理起来是相当麻烦的。
除了GB2312这个字符集以外,还有几个中文的字符集:Big5、HKSCS、GBK、GB18030。
Ø Big5:台湾使用的编码标准,繁体中文字符,字符数也有7000多个。
Ø HKSCS:香港使用的编码标准,繁体中文字符,但跟Big5不同
Ø GBK:《汉字内码扩展规范》是GB2312的扩展集,不仅增加了大量简体中文字符和符号,也增加了对繁体中文字符的支持,另外还留有用户自定义字符空间,总共字符数在22000左右。
Ø GB18030:《信息交换用汉字编码字符集 基本集的扩充》将会成为中国字符编码规范新标准,它兼容GB2312和GBK。
GB2312、Big5、HKSCS是同一时期的产物,虽然都是通过扩展ASCII来实现的,但是它们彼此之间并不兼容,GBK作为GB2312的扩展产物,它几乎涵盖了Big5里所有的繁体字,并将一些不常见的中文字符也添加进入标准,windows操作系统支持的中文字符集也就是GBK;GB18030是2000年制定的标准,它为了兼容GB2312和GBK,保留了双字节编码,同时为了扩展,新增了四字节编码,扩展后的GB18030字符集新增了部分少数民族文字,支持的字符数量比GBK多5000多个。关于GB18030的更多信息如下文档:
http://download1.csdn.net/down3/20070617/17001610116.pdf
Unicode
通过对上面知识的学习,你就会觉得Unicode(Universal Multiple-Octet Coded Character Set)的出现是种必然,如果没有一套统一的字符编码标准,我们将举步维艰。Unicode提供了两套字符编码标准:
Ø UCS-2(Unicode-16):2个字节字符编码
Ø UCS-4(Unicode-32):4个字节字符编码
Unicode编码能支持的字符数相当多,Unicode-16就能定义65535个字符,其中包含了大量中文字符(一个中文字符只暂一位)。
其实Unicode是一种理想化的字符标准,它并没有过多的考虑目前已经存在的字符集标准,它只与ISO-8859-1兼容,但它并不与ASCII兼容,想从ASCII编码转换为Unicode编码相当困难;另外,Unicode里很多字符都有‘0’字节,这将导致C语言会误认为它为字符串结束标志,这是相当可怕的,如果使用了Unicode编码,所有用C语言实现的系统将无法正常工作。这也是为何会出现UTF的原因。
UTF编码
UTF(UCS Transformation Format)实现了Unicode与计算机所使用的编码之间的映射关系。常用的UTF编码有:UTF-8、UTF-16、UTF-7等。
Ø UTF-8:是三字节变长字符编码,它能兼容ASCII编码。
Ø UTF-16:是Unicode的标准实现,与Unicode编码规范相同
Ø UTF-16BE:UTF-16编码big endian,先存放高字节
Ø UTF-16LE:UTF-16编码little endian,先存放低字节
其中,big endian和little endian是CPU处理多字节字符的不同方法,因CPU的不同而有所不同。另外,很多人都认为UTF-8和Unicode是一个概念,其实UTF-8只是Unicode标准的一种编码实现,是目前使用得比较多的字符编码格式之一。
字符串在内存中的存放方法:
在 ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS)。比如,"Bob123" 在内存中为:
42 6F 62 31 32 33 00
B o b 1 2 3 \0
在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符也被称作多字节字符。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节:
D6 D0 CE C4 31 32 33 00
中 文 1 2 3 \0
在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串 "中文123" 在 Windows 2000 下,内存中实际存放的是 5 个序号:
2D 4E 87 65 31 00 32 00 33 00 00 00 ← 在 x86 CPU 中,低字节在前
中 文 1 2 3 \0
一共占 10 个字节。
两种解决URL传输中文的方法:
1.在tomcat的server.xml文件中加URIEncoding="gb2312"
2.在传输前对中文进行编码,在处理时再反编码
java.net.URLEncoder.encode(name,"UTF-8");
java.net.URLDecoder.decode(name, "UTF-8");
个人推荐使用第二种。
编码转换:new String(name1.toString().getBytes("ISO-8859-1"),"GBK");ISO-8859-1转换为GBK
以下为编码详细说明:
Java标准字符集
所谓Java标准字符集,就是Java平台支持的字符集:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16。你应该比较熟悉前面三种字符集,后面三种字符集你应该了解得比较少,也很难会用到,不过我还是会在后面的文章中提到这些概念。另外,你应该注意到,Java并不支持我们常用的中文字符集GB2312、GBK等,我想是因为中文字符集没有通用性,并且Unicode也能很好的支持中文字符集,所以就没必要将中文字符集作为标准字符集定义。下面,我们就每种自己的概念和关联进行介绍;当然,重点会是中文字符集和Unicode。
US-ASCII
你还依稀记得C语言支持的字符编码格式吗?使用的就是US-ASCII,这是一个出现得比较早的字符编码规范;因为它出现比较早,在通用型方面也考虑得比较少,所以也比较简单。一个ASCII字符用一个字节存储,也就是说它可以用来表示256个不同的字符。由于英文大小写字母、阿拉伯数字和标点符号等字符是有限的,所以就把前128个字符作为常用字符,而剩下的高位字符作为扩展字符。这128个字符通常用来表示音标、特殊字符等。
ISO-8859-1
ISO-8859-1也常被称为Latin_1(拉丁1)字符集,像MySQL的默认字符集就是ISO-8859-1,其他它与ASCII编码类似,也是用一个字节表示一个字符,也只用于表示英文字符、数字、符号及特殊字符。它与ASCII唯一的不同在于它是一个国际标准,而ASCII只是一个美国国家标准。对该标准更详细的信息可以参考下面一篇文档:
http://download1.csdn.net/down3/20070617/17001523603.pdf
中文字符集
通过对上面两种字符集的了解,如果想用它们来表示中文字符集,显然有些不太现实,因为常用的中文字符都有上千个之多,所以我们需要能表示更多字符的字符集实现中文字符编码。但又为了兼容ASCII编码,中国在ASCII的基础上制定了自己的字符编码规范,也就是我们比较熟悉的GB2312,它的全称是GB2312-80信息交换用汉字编码字符集(基础集)。它能定义了7000多个常用汉字和符号,GB2312的实现是通过使用两个扩展ASCII字符来定义一个中文字符,根据这一特定,我们就可以判断相邻的两个ASCII字符是否为扩展字符,我们就可以确认这两个字符组成一个中文字符,但是在扩展ASCII字符中,也定义了一些其他字符,所以相邻两个ASCII同为扩展字符时,并不能肯定的说它是一个中文字符,处理起来是相当麻烦的。
除了GB2312这个字符集以外,还有几个中文的字符集:Big5、HKSCS、GBK、GB18030。
Ø Big5:台湾使用的编码标准,繁体中文字符,字符数也有7000多个。
Ø HKSCS:香港使用的编码标准,繁体中文字符,但跟Big5不同
Ø GBK:《汉字内码扩展规范》是GB2312的扩展集,不仅增加了大量简体中文字符和符号,也增加了对繁体中文字符的支持,另外还留有用户自定义字符空间,总共字符数在22000左右。
Ø GB18030:《信息交换用汉字编码字符集 基本集的扩充》将会成为中国字符编码规范新标准,它兼容GB2312和GBK。
GB2312、Big5、HKSCS是同一时期的产物,虽然都是通过扩展ASCII来实现的,但是它们彼此之间并不兼容,GBK作为GB2312的扩展产物,它几乎涵盖了Big5里所有的繁体字,并将一些不常见的中文字符也添加进入标准,windows操作系统支持的中文字符集也就是GBK;GB18030是2000年制定的标准,它为了兼容GB2312和GBK,保留了双字节编码,同时为了扩展,新增了四字节编码,扩展后的GB18030字符集新增了部分少数民族文字,支持的字符数量比GBK多5000多个。关于GB18030的更多信息如下文档:
http://download1.csdn.net/down3/20070617/17001610116.pdf
Unicode
通过对上面知识的学习,你就会觉得Unicode(Universal Multiple-Octet Coded Character Set)的出现是种必然,如果没有一套统一的字符编码标准,我们将举步维艰。Unicode提供了两套字符编码标准:
Ø UCS-2(Unicode-16):2个字节字符编码
Ø UCS-4(Unicode-32):4个字节字符编码
Unicode编码能支持的字符数相当多,Unicode-16就能定义65535个字符,其中包含了大量中文字符(一个中文字符只暂一位)。
其实Unicode是一种理想化的字符标准,它并没有过多的考虑目前已经存在的字符集标准,它只与ISO-8859-1兼容,但它并不与ASCII兼容,想从ASCII编码转换为Unicode编码相当困难;另外,Unicode里很多字符都有‘0’字节,这将导致C语言会误认为它为字符串结束标志,这是相当可怕的,如果使用了Unicode编码,所有用C语言实现的系统将无法正常工作。这也是为何会出现UTF的原因。
UTF编码
UTF(UCS Transformation Format)实现了Unicode与计算机所使用的编码之间的映射关系。常用的UTF编码有:UTF-8、UTF-16、UTF-7等。
Ø UTF-8:是三字节变长字符编码,它能兼容ASCII编码。
Ø UTF-16:是Unicode的标准实现,与Unicode编码规范相同
Ø UTF-16BE:UTF-16编码big endian,先存放高字节
Ø UTF-16LE:UTF-16编码little endian,先存放低字节
其中,big endian和little endian是CPU处理多字节字符的不同方法,因CPU的不同而有所不同。另外,很多人都认为UTF-8和Unicode是一个概念,其实UTF-8只是Unicode标准的一种编码实现,是目前使用得比较多的字符编码格式之一。
字符串在内存中的存放方法:
在 ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS)。比如,"Bob123" 在内存中为:
42 6F 62 31 32 33 00
B o b 1 2 3 \0
在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符也被称作多字节字符。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节:
D6 D0 CE C4 31 32 33 00
中 文 1 2 3 \0
在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串 "中文123" 在 Windows 2000 下,内存中实际存放的是 5 个序号:
2D 4E 87 65 31 00 32 00 33 00 00 00 ← 在 x86 CPU 中,低字节在前
中 文 1 2 3 \0
一共占 10 个字节。
发表评论
-
Java代码优化与sql语句优化
2013-04-11 18:04 1258代码优化: 1.对于一修修饰符的使用:该使用final、 ... -
java基础
2012-01-11 18:04 923Servlet生命周期与工作原 ... -
hibernate二级缓存实战之OSCache
2011-03-04 15:32 745附件为本实例源码 -
Java程序优化技巧
2011-03-01 10:32 743可供程序利用的资源(内存、CPU时间、网络带宽等)是有限的,优 ... -
Java中四种XML解析技术
2010-12-02 11:22 675在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前 ... -
初识设计模式
2010-12-01 22:20 740从JAVA类库看设计模式:ht ... -
JAVA设计模式之Observer
2010-12-01 22:18 902一. Observer樣式應用於Android框架設計 来自: ... -
JAVA设计模式之Builder
2010-12-01 22:12 1165应用1: 1. 代码: 在BroswerActivity ... -
JAVA设计模式之Abstract Factory
2010-12-01 22:08 836abstract factory是对象的创建型模式。这种设计模 ... -
JAVA设计模式之Template method
2010-12-01 22:04 1179模板方法(Template method)模式在Android ... -
java设计模式之Decorator与Adapter
2010-12-01 20:31 810JAVA IO 设计模式彻底分 ... -
Java中byte、short、int之间的转换
2010-11-25 16:35 3660先温习下计算机基础理论 byte是一个字节保存的,有8个位, ... -
学习java的好去处
2010-11-14 15:00 8261、http://cn.sun.com/ ... -
基于xmlrpc的远程控制管理
2010-11-12 15:32 1268此文转自:http://helloha ... -
java远程通讯技术及简单实现
2010-11-12 15:29 1084此文转自:http://staratsky.iteye.com ... -
java堆栈
2010-10-18 11:23 683Java栈与堆 ----对这两 ... -
java.util.concurrent 多线程框架
2010-09-30 14:53 942(来源于http://www.zhuaxia.com/item ... -
主题:减少变量实例化次数有多大作用
2010-09-24 23:21 937在JE上看到了一个帖子讨论下面这种代码的优化问题的: ... -
Java的IO系统工作原理
2010-09-17 17:08 856Java的IO系统工作原理 ...
相关推荐
Java字符编码监听器是Java Web开发中的一个重要概念,主要用于处理HTTP请求和响应中的字符编码问题。在Java Servlet规范中,提供了`SetCharacterEncodingFilter`这样的过滤器,用于确保请求参数和响应内容的正确编码...
### Java字符编码错误整理大全 #### 一、概述 在Java开发过程中,字符编码问题是非常常见且容易引发一系列乱码问题的重要因素。本篇将详细梳理Java中的字符编码相关知识点,帮助开发者解决实际工作中遇到的各种...
### Java字符编码问题详解 #### 一、引言 在Java开发过程中,字符编码问题是一个常见且容易引发各种隐藏问题的领域。不正确的字符编码处理可能导致数据丢失、乱码甚至是程序异常。本文将深入探讨Java中的字符编码...
Java字符编码是编程中至关重要的一个概念,尤其是在处理多语言数据时。本文主要探讨了Java中与字符编码相关的基础知识,包括ISO8859-1、GB2312、GBK、Unicode以及UTF编码。 首先,ISO8859-1是一种早期的单字节编码...
### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...
### Java字符编码转换详细过程 #### 一、Java程序的生命周期与字符编码处理流程 Java程序的生命周期可以概括为三个主要阶段:编写源代码、编译源代码以及运行编译后的类文件。在这个过程中,涉及到多种字符编码的...
Java字符编码系列三主要探讨了Java应用中遇到的编码问题,包括编码基础知识、Java与系统软件、URL、工具软件等方面的处理。文章通过“中文”二字举例,解释了不同编码方式如GB2312、Unicode、UTF-8的表示方法。 1. ...
Java字符编码解析是一个重要的主题,尤其对于移动开发,如Android平台,因为良好的字符处理能力是构建国际化应用的基础。本文将深入探讨Java中的字符编码概念、常见的编码格式、以及如何在Java程序中正确处理字符...
### JAVA字符编码详解:Unicode, ISO-8859-1, GBK, UTF-8 及其相互转换 #### 一、引言 在Java编程中,字符编码的管理和转换是一项基本而又重要的任务。不同的编码标准适用于不同的场景,而理解和掌握这些编码之间...
本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。本文的...
Java字符编码知识是软件开发中不可或缺的一部分,尤其是在处理多语言环境和网络应用时。下面将详细介绍字符集、编码以及Java中的字符编码处理。 1. **什么是字符集?什么是编码?** 字符集(Charset)是一组抽象...
Java字符编码原理主要涉及到字符集、编码转换以及在开发环境中如何正确配置编码格式,以确保程序处理各种语言,特别是中文时的正确性。在Java中,字符编码涉及到以下几个关键概念: 1. **字符集(Charset)**:字符...
Java字符编码原理主要涉及到字符集、编码转换以及在开发环境中如何确保正确的编码设置。Java作为跨平台的语言,处理字符编码的方式对于确保程序的兼容性和国际化至关重要。以下是对标题和描述中涉及的知识点的详细...
Java字符编码转换是Java开发中一个重要的概念,涉及到数据的正确读取、存储和传输。在Java中,编码转换通常发生在以下几个场景: 1. **JVM启动与系统属性**: JVM启动时,会根据操作系统的环境设置一些系统属性,...
在Java编程语言中,字符编码是一个至关重要的概念,它涉及到数据的存储、处理和传输。字符编码决定了如何将字符(如字母、数字、符号)转换为数字表示,以便计算机能够理解并操作它们。本篇文章将深入探讨Java中的...
### Java 字符编码详解 #### 一、Java 字符编码基础概念 在深入探讨 Java 字符编码的问题之前,我们先来了解一下字符编码的基本概念。字符编码是计算机内部表示字符的一种方式,它涉及到如何将人类可读的文字转换...
本文将围绕“Java字符集编码简记”这一主题,深入探讨相关知识点,并结合标签“源码”和“工具”,探讨在实际开发中如何运用和处理字符编码问题。 首先,我们需要理解字符集的概念。字符集是一系列符号的集合,例如...
语言程序设计资料:java字符编码.doc
UTF-8(Unicode Transformation Format-8)是一种可变长度的字符编码格式,主要用于在网络中快速传输Unicode字符。UTF-8的基本原理是根据Unicode字符的范围,将其映射成不同长度的编码,具体规则如下: - 每个英文...
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),...