用户操作
[即时聊天] [发私信] [加为好友]
曾巧ID:numenZQ
42206次访问,排名2821,好友0人,关注者0人。
numenZQ的文章
原创 29 篇
翻译 16 篇
转载 2 篇
评论 16 篇
最近评论
xh:不推荐修改web.xml,设置java_options更好
numenZQ:补充说明一点,使用java.util.zip包时,是以UTF-8编码格式读取的文件名,因此在中文windows操作系统(Windows操作系统默认字符集为:GBK)中使用时会导致文件名解析错误,因此需要使用org.apache.tools.zip.ZipEntry和 org.apache.tools.zip.ZipOutputStream类来解决这一问题。
numenZQ:这个是需要明确知道字符串的成分,该方法只是为了满足读取不同字符集相应字符串,还是以“多哈亚运会”为例:如果字符集为GBK,截取前6个字节,结果为:“多哈亚”;当字符集为UTF-8时,截取前6个字节,结果则为:“多哈”,这是因为GBK是双字节编码,而UTF-8是三字节变长编码,如果不分字符集来读取对应长度的字串,则会出现字串内容与预期不符,长度错误等问题。
lyazure:仔细看了你的代码,作用是从一个字符串中获取指定字节数的字符,不知道你要这么做的最终目的是用来做什么。除非明确知道字符串的成分,否则这种做法很难做到完美,比如你的代码中,假如出现要从“多哈亚运会”这样的字符串中截取7个字节,最终会截得3个字符。
Alexandre:ab8e44bc75204d49bf0c9fe68a2b2176 matura foto amatoriale
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Java字符编码收藏

    新一篇: CruiseControl基础配置 | 旧一篇: Java Annotation(4)

     

    作者:曾巧(numenzq)

    摘要

    程序中的字符编码问题和路径(相对路径,绝对路径)问题几乎是每个程序员,特别是Java开发人员在开发过程中都会遇到的;本文主要会提及开发过程经常会接触到的几个字符集:ASCIIISO-8859-1GBKUTF-8等。

       

    内容

    l         Java标准字符集

    l         US-ASCII

    l         ISO-8859-1

    l         中文字符集

    l         Unicode编码

    l         UTF-8编码

    l         概要

     

    Java标准字符集

        所谓Java标准字符集,就是Java平台支持的字符集:US-ASCIIISO-8859-1UTF-8UTF-16BEUTF-16LEUTF-16。你应该比较熟悉前面三种字符集,后面三种字符集你应该了解得比较少,也很难会用到,不过我还是会在后面的文章中提到这些概念。另外,你应该注意到,Java并不支持我们常用的中文字符集GB2312GBK等,我想是因为中文字符集没有通用性,并且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这个字符集以外,还有几个中文的字符集:Big5HKSCSGBKGB18030

    Ø         Big5:台湾使用的编码标准,繁体中文字符,字符数也有7000多个。

    Ø         HKSCS:香港使用的编码标准,繁体中文字符,但跟Big5不同

    Ø         GBK:《汉字内码扩展规范》是GB2312的扩展集,不仅增加了大量简体中文字符和符号,也增加了对繁体中文字符的支持,另外还留有用户自定义字符空间,总共字符数在22000左右。

    Ø         GB18030《信息交换用汉字编码字符集 基本集的扩充》将会成为中国字符编码规范新标准,它兼容GB2312GBK

    GB2312Big5HKSCS是同一时期的产物,虽然都是通过扩展ASCII来实现的,但是它们彼此之间并不兼容,GBK作为GB2312的扩展产物,它几乎涵盖了Big5里所有的繁体字,并将一些不常见的中文字符也添加进入标准,windows操作系统支持的中文字符集也就是GBKGB180302000年制定的标准,它为了兼容GB2312GBK,保留了双字节编码,同时为了扩展,新增了四字节编码,扩展后的GB18030字符集新增了部分少数民族文字,支持的字符数量比GBK5000多个。关于GB18030的更多信息如下文档:

    http://download1.csdn.net/down3/20070617/17001610116.pdf

     

    Unicode

        通过对上面知识的学习,你就会觉得UnicodeUniversal Multiple-Octet Coded Character Set)的出现是种必然,如果没有一套统一的字符编码标准,我们将举步维艰。Unicode提供了两套字符编码标准:

    Ø         UCS-2Unicode-16):2个字节字符编码

    Ø         UCS-4Unicode-32):4个字节字符编码

        Unicode编码能支持的字符数相当多,Unicode-16就能定义65535个字符,其中包含了大量中文字符(一个中文字符只暂一位)。

        其实Unicode是一种理想化的字符标准,它并没有过多的考虑目前已经存在的字符集标准,它只与ISO-8859-1兼容,但它并不与ASCII兼容,想从ASCII编码转换为Unicode编码相当困难;另外,Unicode里很多字符都有‘0字节,这将导致C语言会误认为它为字符串结束标志,这是相当可怕的,如果使用了Unicode编码,所有用C语言实现的系统将无法正常工作。这也是为何会出现UTF的原因。

     

    UTF编码

        UTFUCS Transformation Format)实现了Unicode与计算机所使用的编码之间的映射关系。常用的UTF编码有:UTF-8UTF-16UTF-7等。

    Ø         UTF-8:是三字节变长字符编码,它能兼容ASCII编码。

    Ø         UTF-16:是Unicode的标准实现,与Unicode编码规范相同

    Ø         UTF-16BEUTF-16编码big endian,先存放高字节

    Ø         UTF-16LEUTF-16编码little endian,先存放低字节

    其中,big endianlittle endianCPU处理多字节字符的不同方法,因CPU的不同而有所不同。另外,很多人都认为UTF-8Unicode是一个概念,其实UTF-8只是Unicode标准的一种编码实现,是目前使用得比较多的字符编码格式之一。

     

    概要

    通过上面文章的学习,希望你能对常用的字符编码有所了解。

       

     

    发表于 @ 2007年06月17日 00:13:00|评论(loading...)|编辑

    新一篇: CruiseControl基础配置 | 旧一篇: Java Annotation(4)

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © numenzq