`
tomcat_oracle
  • 浏览: 311864 次
社区版块
存档分类
最新评论

Java编程之字符集问题研究(一)

    博客分类:
  • Java
阅读更多
1. 概述
  本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。
  在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687"。注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示"。
  2. 编码基本知识
  最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。
  2.1. iso8859-1
  属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母'a'的编码为0x61=97。
  很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。
  2.2. GB2312/GBK
  这就是汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。
  2.3. unicode
  这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母'a'为"00 61"。
  需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。
  2.4. UTF
  考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
  注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。
  3. java对字符的处理
  在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。
  3.1. getBytes(charset)
  这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。
  3.2. new String(charset)
  这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。参考上述getBytes的例子,"gbk"和"utf8"都可以得出正确的结果"4e2d6587",但iso8859-1最后变成了"003f 003f"(两个问号)。
  因为utf8可以用来表示/编码所有字符,所以new String( str.getB+ytes( "utf8" ), "utf8") === str,即完全可逆。
  3.3. setCharacterEncoding()
  该函数用来设置http请求或者相应的编码。
  对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。参见下述"表单输入"。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。javadoc上说明:This method must be called prior toreading request parameters or reading input using getReader()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。
8
7
分享到:
评论

相关推荐

    Java程序设计习题集下载

    习题集内容覆盖面广,包括:Java言的基本常识、基本语法、面向对象的基本概念、数组、字符串、异常处理、文件和数据流、图形用户界面设计、小应用程序、线程、编程规范、网络程序设计、多媒体民图形学程序设计以及...

    Java编程之字符集问题研究

     本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。  在下面的描述中,将以中文两个字为例,经查表可以知道其GB2312编码是d6d0cec4,Unicode编码为4e2d 6587,UTF编码是e4b8ad e69687...

    JAVA程序设计习题集

    习题集内容覆盖面广,包括:Java言的基本常识、基本语法、面向对象的基本概念、数组、字符串、异常处理、文件和数据流、图形用户界面设计、小应用程序、线程、编程规范、网络程序设计、多媒体民图形学程序设计以及...

    java程序文件字符编码转换器

    java程序文件字符编码转换器 JLabel labsuffix = new JLabel("指定文件的后缀"); JLabel labCharacter = new JLabel("选择转换方式"); JLabel labfiletext = new JLabel("正在处理"); JTextArea jTextArea = new...

    java字符集转换程序(GBK到UTF-8)

    该程序可以实现不同字符集的转换,比如从GBK到UTF8 本程序会递归地处理本目录及其子目录中的后缀为指定后缀的文件 由于功能不完善,最好只对一个目录执行一次操作,而且在输入字符集时要仔细

    java面向对象程序设计习题集

    java 习题集包括有答案 引 言 6 第一章 JAVA基础 7 一、填空题 7 二、判断题 9 三、选择题 9 四、程序阅读题 26 第二章 控制结构 32 一、选择题 32 二、填空题 48 三、判断题 50 四、程序阅读题 51 五、编程题 55 第...

    java中文乱码字符集解决大全

    Abstract:本文深入分析了Java程序设计中Java编译器对java源文件和JVM对class类文件的编码/解码过程,通过此过程的解析透视出了Java编程中中文问题产生的根本原因,最后给出了建议的最优化的解决Java中文问题的方法...

    自考04747《Java语言程序设计》课后习题答案全集.doc

    1.6 JAVA语言使用什么字符集?共有多少个不同的字符? 5 1.7 JAVA语言标识符的命名规则是什么? 6 1.8 JAVA有那些基本数据类型,它们的常量又是如何书写的? 6 1.9 指出下列内容哪些是JAVA语言的整型常量,哪些是...

    JAVA字符串操作类CTool.java字符转换类.rar

    JAVA字符串操作类CTool.java字符转换类,此类中收集Java编程中WEB开发常用到的一些工具。为避免生成此类的实例,构造方法被申明为private类型的。封装的功能:字符串从GBK编码转换为Unicode编码、对字符串进行md5...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-024-Java语言概述-第一个程序-当前程序存在的问题.avi 北京动力节点-Java编程零基础教程-025-Java语言概述-第一个程序-系统变量Path分类.avi 北京动力节点-Java编程零基础教程-...

    40个经典的Java问题编程求解示例集.rar

    40个经典的Java问题编程求解示例集,比如兔子总数问题、判断101-200之间有多少个素数的问题、打印出所有的 "水仙花数 ",条件运算符的嵌套问题,将一个正整数分解质因数问题,两个正整数m和n,求其最大公约数和最小...

    电子教材:《Java语言程序设计-统一代码(Unicode)字符集》pdf版

    电子教材:《Java语言程序设计-统一代码(Unicode)字符集》pdf版

    JAVA编程题全集(100题).doc

    java编程题,里面包含了java的基础语法(字符串拼接,类的创建)以及线程练习。其中还有一些经典的编程程序(素数,水仙花数等)。

    JAVA编程题全集(100题及答案)

    编写一个Java程序,用if-else语句判断某年份是否为闰年。 打印出所有的 "水仙花数 将一个正整数分解质因数 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 输出9*9口诀。 利用递归方法求5!...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    Java CTool.java一个好用的字符串操作类.rar

    分享一个Java字符串操作类CTool.java源代码下载,包括了字符串转换功能,此类中收集Java编程中WEB开发常用到的一些工具。为避免生成此类的实例,构造方法被申明为private类型的。这个类的功能可实现将数据从数据库中...

    java中文编码问题

    java编程中字符编码问题,包括java源代码文件的字符集,.class文件的字符集,以及jVM内部的字符集编码等等。

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

Global site tag (gtag.js) - Google Analytics