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

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及相关字符集编码问题的深入探讨,希望能帮助开发者们更好地理解和应对这一领域内的挑战。

    java支持的字符集

    Java作为一种广泛使用的编程语言,在处理多语言环境下的文本时,其对字符集的支持显得尤为重要。本文将详细介绍Java所支持的基本字符集(Basic Encoding Set)和扩展字符集(Extended Encoding Set),并针对每个...

    java字符集编码问题

    在Java编程中,字符集编码问题是一个常见且重要的议题。由于不同的系统、平台以及网络环境中可能存在多种字符编码格式,这导致了在处理文本数据时可能会遇到编码不一致的问题。本文旨在深入探讨与Java相关的字符集...

    Java Unicode 和字符集

    这些类支持多种字符集编码,如UTF-8、UTF-16、ISO-8859-1等,这使得Java程序能够轻松地在不同字符集之间进行转换,从而支持全球化的应用开发。 #### 七、结论 理解Unicode和字符集对于现代软件开发来说是至关重要...

    Java字符集和编码

    在探讨Java字符集和编码之前,我们先了解一下为什么在Java编程中需要关注字符集和编码。Java作为一种广泛应用的编程语言,其内部采用的是Unicode编码,这使得Java能够很好地支持全球化的应用开发。然而,在实际的...

    java字符集编码乱码详解

    综上所述,理解和掌握字符集及其编码规则对于开发高质量的 Java 应用程序至关重要。特别是在处理多语言或多字符集环境下的数据时,合理使用 Unicode 和 UTF-8 等编码方式可以有效避免乱码问题的发生。

    Java io输入输出流及字符集

    Java的IO(Input/Output)系统是其核心特性之一,为程序处理数据的输入与输出提供了强大而灵活的工具。本文将深入探讨Java中的输入输出流以及字符集的相关知识点。 一、Java IO流概述 Java的IO流模型是基于管道的...

    java 获取文件字符集编码依赖包

    在Java编程中,正确地处理文件的字符集编码至关重要,特别是在读取或写入含有非ASCII字符(如中文、日文、韩文等)的文件时。`cpdetector`是Java中一个常用的库,用于自动检测文件的字符集编码。这个库能够帮助...

    Java中字符集的详细介绍

    Java中的字符集是一个重要的概念,尤其对于处理多语言文本或者跨平台的数据交换至关重要。Java语言内部使用Unicode编码,具体来说是UTF-16格式,这意味着每个`char`类型变量能够表示一个Unicode字符,通常占据两个...

    java字符集

    本文主要探讨了字符编码的基本概念以及Java编程语言如何处理不同字符集。随着信息技术的发展,字符编码技术也在不断演进,以支持全球范围内各种语言的文本表示需求。文章通过“中文”二字作为示例,介绍了几种常见的...

    深入Java 中的字符集

    在计算机科学与编程领域中,字符集是一个非常重要的概念,尤其是在处理国际化和多语言应用时。本文将基于提供的标题、描述、标签及部分内容,详细阐述Java中的字符集相关知识,特别是针对Unicode及其编码方式的理解...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.pdf

    Java中的字符编码转换是编程实践中一个至关重要的概念,尤其是在处理多语言环境和跨平台交互时。Java通过统一采用UTF-16编码格式在JVM内部处理字符,简化了字符操作的复杂性。UTF-16是一种变长的Unicode编码,它可以...

    JAVA字符集

    Java字符集是一个涵盖编码基础知识、Java编程环境与字符编码关系以及不同编码标准如何在Java中应用的主题。在本文中,我们将深入探讨这些方面,以便更好地理解Java如何处理各种字符编码。 首先,我们要明白编码的...

    java 字符集的解码方法

    在Java编程语言中,字符集(Charset)是用于表示文本数据的一系列规则,它定义了字符与二进制数据之间的映射关系。字符集的解码是将字节流转换为字符流的过程,通常涉及到从特定编码格式如UTF-8、GBK等还原出原始的...

    java字符集基础知识及问题

    此外,还将探讨Java中处理字符集的常见问题和解决方案。 首先,ISO8859-1是早期的单字节编码,主要用于英文字符,最多可表示256个字符。由于其简单性和与计算机基础单位的匹配,ISO8859-1在某些场景下仍然被广泛...

    Java解决WE8DEC字符集乱码问题

    在IT领域,尤其是在Java编程中,字符编码问题是一个常见的挑战,特别是当涉及到处理不同国家和地区字符集时。WE8DEC是一种Oracle数据库使用的字符集,它主要用于表示西欧语言的字符,包括德语、法语、西班牙语等。...

    java程序设计例题全集

    本资源“java程序设计例题全集”显然是一份涵盖了大学Java程序设计课程中各种实例的集合,旨在帮助学习者深入理解和掌握Java编程。 标题中的“java程序设计例题全集”意味着这份资料包含了大量关于Java编程的实践...

    Java中的字符集编码入门(二)编码字符集与字符集编码的区别[参考].pdf

    在Java编程语言中,理解和掌握字符集编码是至关重要的,特别是在处理各种文本数据时。本文主要探讨了编码字符集和字符集编码的区别,这对于软件开发人员来说是基础且必要的知识。 首先,我们要区分两个概念:编码...

    字符编码和字符集研究

    总的来说,字符集和字符编码是计算机处理文本的基础,理解它们的工作原理和相互关系有助于解决跨语言交流的问题,以及在编程中避免常见的乱码问题。随着全球化的发展,Unicode编码和与其相关的UTF家族成为了现代...

    DB2 GBK 字符集解决方案.zip

    本实践案例主要探讨如何在DB2环境中解决与GBK字符集相关的问题。 GBK字符集是中国大陆地区广泛使用的汉字编码标准,它兼容GB2312,并增加了对繁体字和其他符号的支持,包含了约2万个汉字。在DB2中配置GBK字符集,是...

Global site tag (gtag.js) - Google Analytics