`
hpjianhua
  • 浏览: 240954 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类

国内外网站字符编码详解

阅读更多

Utf-8编码在国外应用普遍,为什么在国内应用却不多呢?

尤其各大门户网站采用Utf-8的几乎没有。是否采用Utf-8,这个问题大家争论已久,但是很

少有人系统地解说为什么要采用Utf-8编码?凡事皆有正反!采用Utf-8编码同样有其利弊,

当利大于弊,我们当然就采用Utf-8? 关于UTF-8编码和中文字符集 中文有三种字符集,统

一文字的编码将是进一步交流的基础。 ·国内网站和BLOG较多使用简体中文编码GB2312 字

符集; ·港澳台地区网站和部落格使用繁体中文网页编码BIG5字符集; ·UTF-8 包含了简体

和繁体中文字符,能正确显示多种语言文字. 统一编码带来的交流便利将在trackback等功能

上体现出。 计算机对多国语言的支持 通常在文档只需支持一种语言的情况下,编码只需收录

该语言内的字元。最常见的就是拉丁字母用ASCII、简体中文用GB2312、繁体中文用BIG5

等。在越来越国际化的环境下,多语言支持对于软件开发已不再是个可有可无的而是必须的功

能。UTF-8就提供了可在同文档同时支持多语言。例如, 汉字:简体字,繁體字韩文:한국

어 阿拉伯文:العربيه 目前很多软件对UTF-8的支持都不太好、开发工具对UTF-8的支持也

不全、程序员对UTF-8的了解不深,所以用UTF-8时会碰见许多问题。但我们坚信UTF8是对

于多语言支持的趋势也是基础。 Unicode 问答集 问:什么是Unicode?答:Unicode 给

每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论什么语言。

Unicode标准已经被这些工业界的领导们所采用,例如:Apple, HP, IBM,


JustSystem, Microsoft, oracle, SAP, Sun, Sybase, Unisys和其它许多公司。最


新的标准都需要Unicode,例如XML, Java, ECMAScript (JavaScript), LDAP,

CORBA 3.0, WML等等,并且,Unicode是实现ISO/IEC 10646的正规方式。许多操作系

统,所有最新的浏览器和许多其他产品都支持它。Unicode标准的出现和支持它工具的存在,

是近来全球软件技术最重要的发展趋势。 问:为什么使用Unicode?答:基本上,计算机只

是处理数字。它们指定一个数字,来储存字母或其他字符。在创造Unicode之前,有数百种指


定这些数字的编码系统。没有一个编码可以包含足够的字符:例如,单单欧州共同体就需要好几种不同的编码来包括所有的

 

语言。即使是单一种语言,例如英语,也没有哪一个编码可以适用于所有的字母,标点符号,和常用的技术符号。这些编码

 

系统也会互相冲突。也就是说,两种编码可能使用相同的数字代表两个不同的字符,或使用不同的数字代表相同的字符。任

 

何一台特定的计算机(特别是服务器)都需要支持许多不同的编码,但是,不论什么时候数据通过不同的编码或平台之间,

 

那些数据总会有损坏的危险。 问:举个例子吧。答:比如,简体中文(GB)、繁体中文(BIG5)、日文中,“赵”都是

 

一个字,但是编码不同。在不同的编码下,BIG5的赵是0xBBAF,而0xBBAF在GB里面就被显示为“化”,这就是乱码。

 

而Unicode采用统一的编码,“赵”只有一个,不必管他在哪种文字里。 问:Unicode的优点是什么?答:举 一个最明

 

显的例子就是Windows 2000/XP以及微软Office2000及其后的产品。因为这些软件都是Unicode内核,因此,无论何

 

种文字,都可以在上面正常显示,而且是同屏显示。以前,简体中文的Word文件拿到英文版打开就会是乱码,简体中文的

 

程序在Windows英文版上运行会出现乱码,而现在一切都解决了。问:中国京剧戏考为什么使用Unicode?答:因为有些

 

剧本中的生僻字,只在扩展字库或繁体字库中才有,有的甚至没有。而Unicode不仅包含了所有常用字和大部分生僻字,而

 

且因为其可扩展,在现在没有的情况下,将来也是可以扩充的。例如最新的Unicode 4.0标准,较3.0增加了很多生僻字。

 

目前有70207个汉字。再有一点就是Unicode在将来会取代现有的GBK及BIG5。 什么是 UCS 和 ISO 10646? 国 际标

 

准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS). UCS 是所有其他字符集标准的一个超集. 它保

 

证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何

 

信息. 在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 ''

 

或 '/', 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不

 

进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为

 

Unicode 的外部编码. UCS只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的UCS编码是

 

6C49,我可以用4个ascii数字来传输、保存这个编码;也可以用utf-8编码:3个连续的字节E6 B1 89来表示它。 UTF-8

 

就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下: UCS-2编码(16进制) UTF-8 字节流(二进制)

 

0000 - 007F 0xxxxxxx 0080 - 07FF 110xxxxx 10xxxxxx 0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx 例如

 

“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx

 

10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110

 

10110001 10001001,即E6 B1 89。 UTF-16 UTF-16是Unicode的其中一个使用方式。 UTF是 Unicode

 

Translation Format,即把Unicode转做某种格式的意思。它定义于ISO/IEC 10646-1的附录Q,而RFC2781也定义

 

了相似的做法。在Unicode基本多文种平面定义的字符(无论是拉丁字母、汉字或其他文字或符号),一律使用2字节储

 

存。而在辅助平面定义的字符,会以代理对(surrogate pair)的形式,以两个2字节的值来储存。 UTF-16比起UTF-

 

8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。 多语言编码 多语言编

 

码的优点是可以在一个页面里同时显示多种语言。像这样,“アメリカ”、“검색센터”、“กองทัพอากาศ”。但是本地编码的

 

方式通常只能显示一种语言的文字,其他语言的文字就乱码了。 为什么在一个页面里会要多种文字呢?举个例子,blog经

 

常引用别人的网站吧,那么我现在引用了这个“http://www.콘테이너시공테크.com”,还有这个名称比较有趣的

 

“http://www.♣.com”。这就需要多语言的编码了。(这些网站在支持punycode的浏览器里,如mozilla, firefox,是可

 

以直接访问的) 再举个例子,我有一个webmail,界面是中文的,编码是GBK。朋友给我发邮件,中文的、英文的都没有问

 

题,正常显示。可我还有朋友是以色列的,用的是希伯来语给我发的邮件。完蛋,邮件内容都是乱码了。我得手工选择浏览

 

器的编码才能看明白邮件的内容。遗憾的是,这时界面的“回复”按钮又成了乱码,搞得我看不出哪个按钮是回复了。如果

 

webmail是多语言的编码,比如UTF-8,就不会有这样了。 UTF-8对中文为主的网站有个缺点是,页面变长了。不是内容

 

显示变长了,而是文件的size变长了。UTF-8对一个中文字符的编码通常是3个 byte,而GB2312是2个byte。 使用

 

UTF-8的原因 由于要使文字档案之中的文字与ASCII兼容,故此 UTF-8 选择了使用可变长度字节来储存 Unicode ,例

 

如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。

 

辅助平面字符则使用4字节。 对 UTF-8 的批评UTF-8 使用可变长度字节储存,使电脑程序设计变得复杂。 (故此,在电

 

脑程序或操作系统内部,多采用UCS-2编码。) 在旧式的中文、日文及韩文编码之中,每字符都使用2字节储存,而UTF-8

 

须使用3字节。 (采用UTF-16编码则可只使用2字节储存。) 泰语以往使用的ISO 8859-11,每字符只使用1字节储存,而

 

UTF-8须使用3字节。此 外,在Windows XP版本中的记事本程序如果保存的是编码类似于UTF-8的GB2312字符,保存

 

重新打开后将错误显示。例如:使用记事本输入“联通”两个字或“毛”字保存后再打开显示错误,如果不全是编码类似于

 

UTF-8的GB2312字符则不会出现这种情况。 下边列出一些Utf-8相关讨论:xdanger说:”地区编码gb2312的好处就

 

是对于搜索引擎比较友好,特别是baidu的网页快照都是gb2312的,Google搜utf-8的效果也不如gb2312。” 我们盲

 

目的向utf-8靠齐是不明智的,因为使用utf-8 用英文的老外没有增加成本,但是我们为了所谓的兼容却要增加成本。因为

 

如果是全英文的话,数据库根本不会增加,什么意思呢,就是说如果英文站点换成utf8,只是编码方式变了一下,其他的基

 

本上一点影响都没有,但是带来的好处是鲜见的。其他文字已经在utf-8编码里面了,所以可以任意使用。(例如在英文站

 

点上如果用utf-8,汉字就可以使用了,但是使用3个字节编码,但是汉字毕竟是少数!所以他们不是很在乎。) 但是如果

 

在国内,情况就不同了,大部分都是汉字,用GB2312(国家标准GB18030-2000)编码,两个字节编码,如果换成utf-

 

8后,就变成了 3个字节,数据明显增大,有人会说utf-8解决了兼容问题,你试想一下,来中文站点的有几个是使用英文

 

以外语言的!!如果他用英文,恭喜你,只要你装上了GB编码,你就可以自由的使用了,因为GB中是有英文字体的!如果

 

你担心他看不懂中文,那你用utf-8编码的中文他也是看不懂的!数字图书馆,也就是图书数字化,推荐使用iso 10646

 

(4byte编码) 特 别需要注意的是,ISO 10646 / Unicode也有多种变换形式,UTF-8和UTF-16。新近又增加了UTF-

 

32。从数字化的发展来看,最好直接使用UCS-2而不要涉及这些变换形式,以免造成今后转换的负担。UTF-8看来已经落

 

后;而UTF-16(Surrogate)还不够成熟。UTF-32正处在发展当中。 utf-8是一种歧视性的编码,采用gb2312一个汉

 

 

字只需要两个字节,而utf-8要三个字节,平白无故的就要多出一个字节来,你想想这样中文文档的存储,网络传输平白又

 

要多出多少浪费来。老外自己都承认了: Let’s address the problem first: UTF-8 is kind of racist. It allows us

 

round-eye paleface anglophone types to tuck our characters neatly into one byte, lets most people

 

whose languages are headquartered west of the Indus river get away with two bytes per, and

 

penalizes India and points east by requiring them to use three bytes per character. 就算要统一编码,作

 

为中国人那也只能支持utf-16,而不是utf-8

 

 

转载自:http://sangai.iteye.com/blog/459317

 

 

分享到:
评论

相关推荐

    常用字符编码详解.doc

    字符编码详解 字符编码是计算机科学中的一种基础概念,它是指将文字、符号等字符转换为计算机可以识别的二进制代码的过程。常用的字符编码有 ASCII、GB2312、GBK、GB18030 等。 1. ASCII 编码 ASCII 编码是一种 7...

    字符集和字符编码详解

    字符集和字符编码是计算机处理文字的基础,它们决定了如何在二进制的世界中表示和传输人类语言。本文将深入探讨这两个概念,以及相关的知识点。 首先,我们要理解什么是字符集。字符集,顾名思义,就是一个集合,...

    字符编码详解

    ### 字符编码详解 #### 一、编码问题的由来及相关概念理解 ##### 1.1 字符与编码的发展历程 字符编码的历史可以追溯到计算机发展的早期阶段,当时计算机仅能支持英语,即ASCII(American Standard Code for ...

    Mysql字符集编码详解

    Mysql字符集编码详解 Mysql数据库中的字符集编码问题是许多开发者经常遇到的一个问题,特别是在JAVA项目中。解决这个问题需要从多方面入手,包括服务器、数据库、数据表和连接等四个层次。这篇文章将详细介绍如何...

    常用编码详解 常用编码详解 常用编码详解 常用编码详解

    Unicode是一个与UCS高度兼容的字符编码标准,最初由多个语言软件制造商合作创建,旨在统一全球的字符编码。Unicode不仅与ISO 10646标准保持兼容,还提供了关于字符语义的更多细节,以支持更高质量的排版和打印。...

    各种字符编码详解.doc

    字符编码是计算机科学中的基础概念,它涉及到计算机如何表示和处理文本信息。本文主要讨论了字符编码的历史、ASCII码、OEM字符集以及多字节字符集,特别是针对中文字符编码的挑战。 首先,让我们从ASCII码说起。...

    JAVA中文字符编码问题详解.doc

    JAVA 中文字符编码问题详解 在 JAVA 中,中文字符编码问题一直是让人头疼的问题,特别是在 WEB 应用中。网上的分析文章和解决方案都很多,但总是针对某些特定情况的。本文将详细解释 JAVA 中文字符编码问题的根源,...

    常用字符集编码详解

    ### 常用字符集编码详解 在信息技术领域,字符集编码是数据处理与传输的基础,不同的编码方式决定了计算机如何解读和表示文本信息。本文将深入解析几种常用的字符集编码,包括ASCII、GB2312、GBK、GB18030、Big5...

    各种字符编码方式详解及由来

    一直对字符的各种编码方式懵懵懂懂,什么ANSI UNICODE UTF-8 GB2312 GBK DBCS UCS……是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们

    字符编码详解 v2.2

    本文主要介绍了字符编码的基础知识,以及常见的字符编码类型,比如ASCII,Unicode,UTF-8,ISO 8859等,以及各种编码之间的关系,同时专门解释了中文字符相关的编码标准,包括GB2312,GBK,GB18030,也专门解释了...

    java字符编码监听器

    Java字符编码监听器是Java Web开发中的一个重要概念,主要用于处理HTTP请求和响应中的字符编码问题。在Java Servlet规范中,提供了`SetCharacterEncodingFilter`这样的过滤器,用于确保请求参数和响应内容的正确编码...

    字符编码详解(基础)

    字符编码是将字符集中的字符转换为计算机可以存储和处理的数字代码的过程。在计算机世界中,字符编码是实现文本存储、传输、处理和显示的基础。因为计算机是基于数字逻辑构建的,它本身无法理解人类语言中的文字,...

    java_字符编码 Javajava_字符编码问题

    ### Java 字符编码详解 #### 一、Java 字符编码基础概念 在深入探讨 Java 字符编码的问题之前,我们先来了解一下字符编码的基本概念。字符编码是计算机内部表示字符的一种方式,它涉及到如何将人类可读的文字转换...

    解决字符编码的过滤器

    ### 解决字符编码的过滤器知识点详解 #### 一、字符编码基础概念 在深入了解如何通过Struts2框架中的Servlet过滤器解决字符编码问题之前,我们先简要回顾一下字符编码的基本概念。字符编码是将计算机内部二进制...

Global site tag (gtag.js) - Google Analytics