`

Java中的字符集编码入门(三)GB2312,GBK与中文网页

阅读更多

GB2312是对中国的开发人员来说很重要的一个词汇,它的来龙去脉并不需要我在这里赘述,随便Goolge之便明白无误。我只是想提一句,记得前一节说到编码字符集和字符集编码不是一回事,而有的字符集编码又实际上没有做任何事,GB2312正是这样一种东西!


    GB2312最初指的是一个编码字符集,其中包含了ASCII所包含的英文字符,同时加入了6763个简体汉字以及其他一些ASCII之外的符号。与Unicode有UTF-8和UTF-16一样(当然, UTF-8和UTF-16也没有被限定只能用来对Unicode进行编码,实际上,你用它对视频进行编码都是可以的,只是编出的文件没有播放器支持罢了,哈哈),GB2312也有自己的编码方案,但这个方案直接使用一个字符在GB2312中的编号作为存储值(与UTF-32的做法类似),也因此,这个编码方案甚至没有正式的名称。我们日常说起GB2312的时候,常常即指这个字符集,也指这种编码方案


    GBK是GB2312的后续标准,添加了更多的汉字和特殊符号,类似的是,GBK也是同时指他的字符集和他的编码。

    GBK还是现如今中文Windows操作系统的系统默认编码(这正是几乎所有网页上的,文件里的乱码问题的根源)。


    我们可以这样来验证,使用以下的Java代码:


String encoding=System.getProperty("file.encoding");
System.out.println(encoding);

 

    输出结果为GBK

    (什么?你的输出不是这样?怎么可能?完了,我的牌子要砸了,等等,你用的繁体版XP?我说你这同志在这里捣什么乱?去!去!)

    说到GB2312和GBK就不得不提中文网页的编码。尽管很多新开发的Web系统和新上线的注重国际化的网站都开始使用UTF-8,仍有相当一部分的中文媒体坚持使用GB2312和GBK,例如新浪的页面。其中有两点很值得注意。

    第一,页面中meta标签的部分,常常可以见到charset=GB2312这样的写法,很不幸的是,这个“charset”其实是用来指定页面使用的是什么字符集编码而不是使用什么字符集。例如你见到过有人写“charset=UTF-8”,见到过有人写“charset=ISO-8859-1”,但你见过有人写“charset=Unicode”么?当然没有,因为Unicode是一个字符集,而不是编码

    然而正是charset这个名称误导了很多程序员,真的以为这里要指定的是字符集,也因而使他们进一步的误以为UTF-8和UTF-16是一种字符集!(万恶啊)好在XML中已经做出了修改,这个位置改成了正确的名称:encoding.第二,页面中说的GB2312,实际上并不真的是GB2312(惊讶么?)。我们来做个实验,例如找一个GB2312中不存在的汉字“亸”(这个字确实不在GB2312中,你可以到GB2312的码表中去找,保证找不到),这个字在GBK中。然后你把它放到一个html页面中,试着在浏览器中打开它,然后选择浏览器的编码为“GB2312”,看到了什么?它完全正常显示!


    结论不用我说你也明白了,浏览器实际上使用的是GBK来显示。

    新浪的页面中也有很多这样的例子,到处都写charset=GB2312,却使用了无数个GB2312中并不存在的字符。这种做法对浏览器显示页面并不成问题,但在需要程序抓取页面并保存的时候带来了麻烦,程序将不能依据页面所“声称”的编码进行读取和保存,而只能尽量猜测正确的编码。
【转自
www.bitsCN.com

分享到:
评论
1 楼 edison87915 2010-08-02  
编码的问题,搞的我头大,看了楼主的文章,懂了很多,有个问题要问。。。
文章最后的小例子,我试了,确实如楼主所说,但是没大明白怎么回事。。。
楼主说HTML文中的charset是编码而不是字符集,但是“亸”字,在GB2312中根本不存在的话,怎么按照charset=gb2312去编码呢,我的意思是GB2312中根本没有“亸”字映射的二进制序列,怎么按照GB2312字符集编码把这个字编码呢。。。。
:D

相关推荐

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

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

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

    ### Java中的字符集编码入门(五):Java代码中的字符编码转换Part1 #### 核心知识点概述: 本文档深入探讨了Java编程语言中字符集编码的基础知识,并着重讲解了字符编码转换的基本原理及其在Java代码中的应用。...

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

    例如,汉字“汉”的UTF-16编码是0x6C49,因此在Java中无论是通过直接赋值`char han='汉'`还是通过16进制值`char han=0x6c49`,内存中表示的都是同一个字符。 Java的IO系统是基于流模型的,分为面向字节的...

    Java基础入门教程 含习题 第08章 IO(输入输出流)(共79页).pptx

    在字符编码方面,Java支持多种字符集,如ASCII、ISO-8859-1、GB2312、GBK和UTF-8等。字符编码和解码是字符流处理过程中的关键步骤,确保数据在不同系统间正确无损地传输。例如,`InputStreamReader`和`...

    Apache common io转码工具类入门教程

    在Java中,常见的编码格式有GBK(中国国家标准汉字编码)和UTF-8(通用多八位编码系统)。GBK编码主要在中国使用,而UTF-8则是一种更通用的编码,能够表示世界上几乎所有的字符。 Apache Commons IO提供了一个名为`...

    KingbaseES入门-Windows.pdf

    文档提到了字符集编码如GBK、GB18030、SQL_ASCII和UNICODE。GBK和GB18030是针对中文字符的编码标准,它们分别代表了简体中文的编码和扩展编码集。UNICODE是一种国际标准的编码方式,它用于存储各种语言的字符。SQL_...

    孙卫琴Java Web全套源码

    9. **charset**: 这个目录可能涉及到字符编码问题,如UTF-8和GBK,以及在Java Web开发中如何处理字符编码转换。 通过学习这些源代码,开发者不仅可以掌握Java Web的基础知识,还能了解到实际项目开发中的最佳实践。...

    java jdbc入门教程笔记

    Java JDBC (Java Database Connectivity) 是Java编程语言中用于与关系数据库进行交互的一种接口。它是Java标准API的一部分,允许程序员使用标准的SQL语句来访问和操作数据库。以下是一些关于JDBC入门的关键知识点: ...

    Oracle数据库由入门到进阶详述.pptx

    在安装过程中,字符集的选择至关重要,因为它决定了数据库支持的语言和字符编码。Oracle的默认字符集为ZHS16GBK,但也可以选择AL32UTF8或WE8ISO8859P1等其他字符集。在安装完成后,可以通过检查服务、物理结构(如...

    Struts1.x入门与提高系列教程.pdf

    示例中给出了创建数据库struts和表t_products的SQL脚本,并指定了字符集为GBK。 4. **ActionForm和Action类**: - ActionForm用于封装Web层和业务层之间传递的数据。 - Action类负责接收ActionForm对象并进行业务...

    Python 面试题汇总及答案详解完整版

    GBK是中文的编码标准,扩展了GB2312。 14. **字节码和机器码**:字节码是解释器理解的中间代码,比机器码更抽象,机器码是计算机硬件直接执行的指令。 15. **三元运算符**:`x if condition else y`,当condition...

    Python道面试题及答案共50道.docx

    - GBK:中国的汉字编码标准,主要针对中文。 以上是Python的一些核心知识点,涵盖了其特性、应用、学习方法、与其他语言的区别、编程规范以及数据存储和字符编码。理解并掌握这些知识对于深入学习和使用Python至关...

    通用JSP页面 jsp入门级文章

    页面的编码设置对于正确显示中文等非ASCII字符集内容至关重要。 文章还使用了Struts标签库中的、、等标签来生成页面头部信息和标题。这些标签来自Struts框架,是Struts提供的一套标签库,它们支持MVC模式,有利于...

    scjp最新教程(英文版)

    3. **字符集编码**:处理字符编码,如UTF-8和GBK。 4. **NIO(New IO)**:非阻塞I/O,提供了选择器(Selector)和通道(Channel)等机制。 5. **文件操作**:创建、读取、写入和删除文件。 **网络编程:** 1. **...

    python教程(阿良)

    Python中可以通过指定编码方式来处理不同的字符集。 ### 第三章 Python数据类型 #### 3.1 列表[List] 列表是一种有序的可变序列,可以存储不同类型的数据项。 #### 3.1.1 定义列表 列表用方括号[]表示,列表...

    JBPM工作流开发指南

    - `GBK`:字符编码集,可以根据实际需求更改。 - `root`:MySQL数据库的用户名。 - `mysql`:MySQL数据库的用户密码。 - `hibernate.dialect`:指定Hibernate使用的数据库方言,以适配不同的数据库特性。 - `...

    经典Python面试题之Python基础篇.docx

    - **Unicode**: 通用字符集,包含了几乎所有国家和地区的字符。 - **UTF-8**: Unicode 的一种编码方式,可变长度,兼容 ASCII。 - **GBK**: 中文编码标准,主要用于简体中文。 #### 14. 字节码和机器码的区别? - ...

Global site tag (gtag.js) - Google Analytics