前序:

一直对编码很痴迷,让数据一目了然不好吗?为什么要去编码,这不是闲的没事,浪费生产力吗?

随着学习的深入,愈加觉得自己无知,世界语言千万种,在互联网的世界里如何表示他们?碰到汉字ASCii就显得苍白无力了,所以,需要更多的字节来表示各种文字,这就需要一个规范;

同时,起初编解码的目的是为了数据的安全,这种技术逐渐应用在各个方面,比如邮件中的base64等等,本文主要讨论有了utf8这个国际编码,为什么国内很多网站执着于gbk?

正文:

UTF8是国际编码,它的通用性比较好,外国人也可以浏览国内网站;

GBK是国内编码,其中gb2312针对简体汉字,通用性比UTF8差,但有其使用空间;

网上看到这样一条提示:如果您的网站客户群体主要是面向国内用户的,建议使用GBK版本,因为它可以节省空间,及相对utf-8版本来讲稳定一些。

其实GBK版本与UTF-8版本功能是一样的.只不过编码方式不同。

GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。

至于UTF-8编码,它是变长的,用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的网站则用UTF-8节省空间。

GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。

GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准,UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。
比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。 所以,对于英文比较多的网站 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

简单的说 UTF-8包含了很多世界范围内的语言编码(相当于一个大字库) 比如日文 韩文 都可以用。GBK和GB2312只是中文的,相当于包含的汉字个数的多少。为了方便还是用UTF-8比较好。

简单说一下原理
字符串都是unicode码,包括英文,汉字...其他字符
unicode可以被转化为字节(byte),如何转换呢,就通过gbk、utf-8、gb2312等编码方式。当把字节转换回字符串的时候,也要用相应的编码方式进行转换。
比如客户端把unicode码通过utf-8转换为二进制流(也就是字节byte),而到了服务器端用gbk编码来把这个二进制流转换为字符串(unicode)的时候,就会出现乱码。必须也要用相应的编码方式进行转换。
        gbk(encode)                  gbk(decode)
unicode---------------->byte[]------------------------------>unicode
String                二进制流                              String

通用转换格式UTF(Universal Transformation Format)
UTF-8是UNICODE的一种变长字符编码
GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,
并涵盖了原Unicode中所有的汉字20902
GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准
GB 2312或GB 2312-80是一个简体中文字符集的中国国家标准
GB 2312标准共收录6763个汉字

区别很简单,不同的字符集。
什么叫字符集,其实就是一张对照表。"啊"字对应UNICODE编码就是"554A",对应的GBK编码是"B0A1".
什么是对照表呢,简单举个例子,就是班级的点名册,"张三"对应10号。计算机不能存储"张三",就存储个"10",取出一个10,按对照表一查,返回一个"张三"。
但是在全学校的点名册里,"张三"对应15号。不同的点名册就是不同的字符集。

在你把"10"存进去了,取出来后,按照班级点名册取出了"张三",很正确,如果用了全学校的点名册,返回给你个外国人,假设你不认识英文,你就觉得乱码
了,其实没乱,你可以把它返回成10,再用班级点名册去对照,"张三"不就出来了。注意:如果全学校的点名册里没有10对应的人,按照约定就返回给
你"????",这个时候才真的乱码了,返回不了了。
不同的点名册,就是不同的字符集。GB2312是一个点名册,后来班里又插班进来俩学生,GB2312加俩学生,老师说,点名册不一样了,换个名吧,叫GBK好了。
中国有个学生叫"张三",在中国是"10"号,后来出国了,联合国给他个号"20"号,一个GBK,一个UTF8,但都是一个人,对应不同的号而已。
ps:UTF-8是UNICODE的变种,从UNICODE编码可以计算出一个字对应的UTF-8编码。

UTF8国际通用为什么还要用GBK?的更多相关文章

  1. Python:将utf-8格式的文件转换成gbk格式的文件

    需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...

  2. 基于emoji 国际通用表情在web上的输入与显示的记录

    定义: emoji 即国际通用表情 场景: 1,ios,android,wp上emoji表情输入与显示 2,web也需作为支撑平台对emoji表情就行输入与显示(解析) 问题: 1,app端输入的表情 ...

  3. 在UTF-8页面中引入编码为GBK的JavaScript文件乱码问题了

    原文地址:http://js8.in/2009/12/11/%E5%AF%B9%E5%BC%95%E7%94%A8%E5%A4%96%E9%83%A8javascript%E9%A1%B5%E9%9D ...

  4. 细说 unicode 、utf-8 、utf-16、ascii 、gbk 、gb2312

    一.计算机的由来 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为”字节“.再后来,他们又做了一些可以处理这些 ...

  5. 将某个MySQL库中的UTF8字符列都转成GBK格式

    DELIMITER $$ DROP PROCEDURE IF EXISTS `dba`.`Proc_ChangeCharacter2GBK`$$ CREATE DEFINER=`root`@`%` P ...

  6. 嵌入式开发之字符叠加---gb2313 国标码,utf8 国际码,unicode 无码

    (1)国标码简介 (2)编码转换 (3)时间获取 (4)显示切换 最近做了个字符叠加,包括时间叠加,字符中文叠加,位置移动,等功能开启.因为一般的字符叠加的点阵式16位,然后填充着16位的编码是gb2 ...

  7. html基础知识1(基本标签)2017-03-07

    摘要:php基础知识1 内容:大学中虽有接触,却是以学生的心态去应付考试的,学的都是理论知识:从今天开始我同样还是要以学生的心态去学习,但却要以要从事工作的心态去练习. 以下为第一天所学内容,因电脑原 ...

  8. HTML入门知识

    B/S:浏览器-服务器 C/S:客户端-服务器 更新麻烦 管理麻烦 PHP:基于BS结构进行项目开发的语言 ====================HTML:超文本标记语言 -- 控制网面内容CSS: ...

  9. HTML入门知识汇总

    1. HTML认识 1.1 什么是HTML HTML是描述(制作)网页的语言,指的是超文本标记语言(Hyper Text Markup Language). 超文本:就是指页面内可以包含图片.链接.甚 ...

随机推荐

  1. 微信JS-SDK“分享信息设置”API及数字签名生成方法(NodeJS版本)

    原文:微信JS-SDK"分享信息设置"API及数字签名生成方法(NodeJS版本) 先上测试地址以示成功: 用微信打开下面地址测试 http://game.4gshu.com/de ...

  2. 虚拟化(一):虚拟化和vmware产品描述

    由于公司最近取得了虚拟化监控,因此,我们需要虚拟化的认识,总结学习,对于虚拟化的概念.从百度百科,例如下列:         虚拟化.是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上 ...

  3. 迷宫的最短路径 (BFS)

    N*M的迷宫,从起点到终点,求最短距离 宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案.  (可以构造成pair或者编码成int来表达状态) ...

  4. Android物业动画研究(Property Animation)彻底解决具体解释

     前p=1959">Android物业动画研究(Property Animation)全然解析具体解释上已经基本展示了属性动画的核心使用方法: ObjectAnimator实现动画 ...

  5. HDOJ 5017 Ellipsoid

    第一次尝试模拟退火..... Ellipsoid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  6. 阿里云CentOS 6.5 设备、执行Docker容器和步骤的方法

    ssh阿里云计算落地ssh username@ip uname -a 查看linux内核版本号,由于Docker推荐使用3.8内核以上,设版本号低可能会不稳定,因此须要选用yum方式升级内核. 导入 ...

  7. S2SH新手框架建立具体过程

    S2SH集成框架新手学习总结 第一章:S2SH框架新手搭建准备工作仅仅都须要导入那些文件 第二篇:S2SH框架新手搭建具体过程 版本号信息:Struts2.3+Hibernate4.3.6+Sprin ...

  8. 【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘

    原文:[高德地图API]从零开始学高德JS API(七)——定位方式大揭秘 摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为w ...

  9. Oracle分区表转换

    Oracle普通表—>分区表转换(9亿数据量) 背景介绍: 环境:Linux 5.5 + Oracle 10.2.0.4 某普通表T,由于前期设计不当没有分区,如今几年来的数据量已达9亿+, 空 ...

  10. Cocos2d-x 3.0 编译出错 解决 error: expected ';' at end of member declaration

    近期把项目移植到cocos2d-x 3.0,在整Android编译环境的时候,出现一大堆的编译出错,都是类似"error: expected ';' at end of member dec ...