GB2312,GBK与中文网页GB2312是对中国的开发人员来说很重要的一个词汇,它的来龙去脉并不需要我在这里赘述,随便Google之便明白无误。我只是想提一句,记得前一节说到编码字符集和字符集编码不是一回事,而有的字符集编码又实际上没有做任何事,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中并不存在的字符。这种做法对浏览器显示页面并不成问题,但在需要程序抓取页面并保存的时候带来了麻烦,程序将不能依据页面所“声称”的编码进行读取和保存,而只能尽量猜测正确的编码。
分享到:
相关推荐
Java中的字符编码转换是编程实践中一个至关重要的概念,尤其是在处理多语言环境和跨平台交互时。Java通过统一采用UTF-16编码格式在JVM内部处理字符,简化了字符操作的复杂性。UTF-16是一种变长的Unicode编码,它可以...
在Java编程语言中,理解和掌握字符集编码是至关重要的,特别是在处理各种文本数据时。本文主要探讨了编码字符集和字符集编码的区别,这对于软件开发人员来说是基础且必要的知识。 首先,我们要区分两个概念:编码...
### Java中的字符集编码入门(五):Java代码中的字符编码转换Part1 #### 核心知识点概述: 本文档深入探讨了Java编程语言中字符集编码的基础知识,并着重讲解了字符编码转换的基本原理及其在Java代码中的应用。...
### Java中的字符集编码入门(六):Java中的增补字符 #### 一、引言 随着全球化进程的加速和技术的发展,字符集编码已经成为软件开发不可或缺的一部分。Java 作为一种广泛使用的编程语言,对于字符集的支持至关...
Java中的字符集编码是编程领域中的重要概念,尤其在处理多语言环境时显得至关重要。本文主要探讨了字符编码的历史发展,特别是ASCII、Unicode和UCS的关系及其在Java中的应用。 ASCII,即美国标准信息交换码,是最早...
Java中的字符编码转换是编程实践中不可或缺的一部分,尤其是在处理多语言和跨平台的场景下。Java选择了UTF-16作为其内部字符表示的标准,这确保了在JVM内存中,所有字符都以统一的方式存储,避免了编码不一致带来的...
北京动力节点-Java编程零基础教程-049-Java基本语法-通过ASCII再理解字符编码.avi 北京动力节点-Java编程零基础教程-050-Java基本语法-ASCII.avi 北京动力节点-Java编程零基础教程-051-Java基本语法-ISO8859-1....
一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...
9. **字符集与编码** - Java中的字符编码默认使用Unicode,通过`Charset` 类可以处理不同的字符编码。 10. **文件复制** - 使用Java I/O可以实现文件的复制,通常结合`InputStream` 和 `OutputStream` 的read和...
例如,过滤器可以用来实现权限验证、字符编码转换、日志记录等功能。通过实现javax.servlet.Filter接口并配置在web.xml中,即可定义和注册过滤器。 5. **JDBC实例**: JDBC(Java Database Connectivity)是Java...
6. **字符集转换(Charset)**:NIO提供了一套完善的字符集转换机制,可以方便地进行字符编码和解码。 学习NIO,首先要理解如何创建和使用通道、缓冲区以及选择器。例如,通过`FileChannel`打开文件,然后使用`...
动力节点的《Java基础301集》是一个全面且深入的Java入门教程,涵盖了从基础知识到高级特性的广泛内容,适合Java初学者和寻求巩固基础的学习者。以下是一些主要的知识点详解: 1. **数据结构**:教程详细介绍了单项...
《Java Web编程宝典(十年典藏版)》是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Java Web进行程序开发的各种技术、技巧。全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境...
4. **数据编码.ppt**:可能涵盖了字符编码相关的知识,例如ASCII、Unicode和UTF-8等编码标准,以及在Java中如何处理字符串和字符流,这是处理文本数据时必须了解的部分。 5. **集合框架**:Java集合框架是处理对象...
本篇文章主要针对Java初学者,提供了一系列基础知识的学习指南,包括基本概念、标识符与关键字的使用以及Unicode字符集的基本理解。 #### 一、标识符 1. **定义**:在Java中,标识符用于命名类、变量、方法等。...
#### 十二、字符集编码 Java使用Unicode编码,这意味着它支持世界上几乎所有的字符集。Java的字符类型`char`占用16位,足以容纳Unicode的基本多文种平面(BMP)的所有字符。 以上是Java初学者入门所需掌握的一些...
- 在开发过程中确保使用的字体支持中文字符集。 - 对于界面上的文字显示,应采用适合中文显示的字体设置。 - 在编写代码时,处理字符串时要注意使用Unicode编码,以确保中文字符能够正确处理。 #### Lightweight ...
默认情况下,Java使用Unicode字符集。 #### 选择题知识点 1. **Java文件编译后文件的扩展名** `.class`。 2. **Java的哪个版本用于嵌入式开发** Java ME。 3. **不合法的标识符** `123u`。 4. **运行Java...
以上就是“动力节点Java基础301集”所涵盖的主要知识点,这套教程不仅适合初学者入门,也适合有一定基础的学习者进一步提升自己的技能水平。通过系统学习这些知识点,相信每位学习者都能够打下坚实的Java编程基础。