千家信息网

GBK、UTF8、GB2312和UTF-8的区别是什么

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,这篇文章主要介绍"GBK、UTF8、GB2312和UTF-8的区别是什么",在日常操作中,相信很多人在GBK、UTF8、GB2312和UTF-8的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简
千家信息网最后更新 2025年01月25日GBK、UTF8、GB2312和UTF-8的区别是什么

这篇文章主要介绍"GBK、UTF8、GB2312和UTF-8的区别是什么",在日常操作中,相信很多人在GBK、UTF8、GB2312和UTF-8的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"GBK、UTF8、GB2312和UTF-8的区别是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以希图国际上字符的一种多字节编码,它对英文运用8位(即一个字节),中文运用24为(三个字节)来编码。UTF-8包罗全天下所有国家需要用到的字符,是国际编码,普片性强。UTF-8编码的文字可以在各国赞成UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在本国人的英文IE上也能显示中文,他们无需下载IE的中文语言赞成包。

GBK是国家标准GB2312根柢上扩容后兼容GB2312的尺度。GBK的文字编码是用双字节来展示的,即不管中、英文字符均运用双字节来表示,为了鉴别中文,将其最高位都设定成1。GBK搜罗一切中翰墨符,是国度编码,普片性比UTF8差,不外UTF8占用的数据库比GBK大。

GBK、GB2312等与UTF8之间都必须经由过程Unicode编码技能花样相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312

CSS5容易从功能上说:

1、GBK通常指GB2312编码 只支持简体中翰墨

2、utf通常指UTF-8,赞成简体中翰墨、繁体中文字、英文、日文、韩文等语言(赞成翰墨更广)

3、通常外洋运用utf-8与gb2312,看自己需求决意

具体详细先容如下:

对于一个站点、论坛来说,如果英翰墨符较多,则首倡使用UTF-8节省空间。不过当初得多论坛的插件通常只支持GBK。
个编码的区别详细解释
简单来讲,unicode,gbk与大五码便是编码的值,而utf-8,uft-16之类即是这个值的表现模式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是纯粹纷歧样的.如"汉"的uncode值与gbk就是不一样的,若是uncode为a040,gbk为b030,而uft-8码,就是把阿谁值表现的形式.utf-8码彻底只针对uncode来组织的,如果GBK要转UTF-8必需先转uncode码,再转utf-8就OK了.

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等实词

标题一:
使用Windows记事本的"另存为",可以在GBK、Unicode、Unicode big endian与UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样辨认编码方式的呢?

我很早前就发现Unicode、Unicode bigendian和UTF-8编码的txt文件的开首会多出几个字节,离别是FF、FE(Unicode),FE、FF(Unicode bigendian),EF、BB、BF(UTF-8)。但这些标志是基于甚么尺度呢?

问题二:
近来在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16与UTF-8这三种编码方式的彼此转换。对于Unicode编码(UCS2)、GBK、UTF-8这些编码方式,我正本就意识。但这个举措让我有些懵懂,想不起来UTF-16和UCS2有甚么关连。
查了查相关资料,总算将这些问题弄明晰了,专门也明了了一些Unicode的细节。写成一篇文章,送给有过类似疑难的友人。本文在写作时尽可能做到下里巴人,但要求读者知道甚么是字节,什么是十六进制。

0、big endian和little endian
big endian与littleendian是CPU处置多字节数的不同方式。比如"汉"字的Unicode编码是6C49。那末写到文件里时,终究是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。如果将49写在前面,等于little endian。

"endian"这个词出自《格列佛游记》。正人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开照旧从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。

咱们一般将endian翻译成"字节序",将big endian与little endian称作"大尾"与"小尾"。

1、字符编码、内码,专门介绍汉字编码
字符必需编码后技能花样被总计机处置惩罚。共计机运用的缺省编码方式就是算计机的内码。初期的总计机应用7位的ASCII编码,为了处理汉字,递次员设计了用于简体中文的GB2312与用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字与682个其它符号。汉字区的内码规模高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个闲暇是D7FA-D7FE。

GB2312赞成的汉字太少。1995年的汉字缩减规范GBK1.0收录了21886个符号,它分为汉字区与图形符号区。汉字区包括21003个字符。

从ASCII、GB2312到GBK,这些编码办法是向下兼容的,即同一个字符在这些方案中总是有雷同的编码,后背的标准支持更多的字符。在这些编码中,英文和中文可以抗衡地处理。区别中文编码的办法是高字节的最高位不为0。依照法式员的俗称,GB2312、GBK都属于双字节字符集 (DBCS)。

2000年的GB18030是取代GBK1.0的正式国度尺度。该尺度收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等首要的多半民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基础上增长了CJK裁减A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。

CJK即是中日韩的含义。Unicode为了节省码位,将中日韩三国语言中的笔墨抗衡编码。GB13000.1便是ISO/IEC 10646-1的中文版,至关于Unicode 1.1。

GB18030的编码采取单字节、双字节和4字节方案。个中单字节、双字节和GBK是纯粹兼容的。4字节编码的码位即是收录了CJK精简A的6582个汉字。比如:UCS的0x3400在GB18030中的编码应当是8139EF30,UCS的0x3401在GB18030中的编码应当是8139EF31。

微软供应了GB18030的晋级包,但这个升级包只不过提供了一套支持CJK扩展A的6582个汉字的新字体:新宋体-18030,的确不窜改内码。Windows 的内码仍然是GBK。

这里还有一些细节:

GB2312的原文照常区位码,从区位码到内码,需要在高字节和低字节上划分加上A0。

关于任何字符编码,编码单元的顺序是由编码方案指定的,与endian无关。例如GBK的编码单元是字节,用两个字节闪现一个汉字。这两个字节的顺序是静止的,不受CPU字节序的影响。UTF-16的编码单元是word(双字节),word之间的顺序是编码方案指定的,word内部的字节分列才会遭到endian的影响。后背还会引见UTF-16。

GB2312的两个字节的最高位但凡1。但吻合这个前提的码位只有128*128=16384个。以是GBK和GB18030的低字节最高位均可能不是1。不外这不影响DBCS字符流的综合:在读取DBCS字符流时,只要碰到高位为1的字节,就能够将下两个字节作为一个双字节编码,而无庸管低字节的高位是什么。

2、Unicode、UCS与UTF
前面提到从ASCII、GB2312、GBK到GB18030的编码办法是向下兼容的。而Unicode只与ASCII兼容(更切确地说,是与ISO-8859-1兼容),与GB码不兼容。譬喻"汉"字的Unicode编码是6C49,而GB码是BABA。

Unicode也是一种字符编码方法,不外它是由国际组织设计,可以包容全球所有语言笔墨的编码方案。Unicode的大名是"UniversalMultiple-Octet Coded Character Set",简喻为UCS。UCS可以看作是"Unicode CharacterSet"的缩写。

根据维基百科全书(http://zh.wikipedia.org/wiki/)的记载:历史上具备两个试图独立设计Unicode的机关,即国际标准化组织(ISO)与一个软件出产商的协会(unicode.org)。ISO垦荒了ISO 10646工程,Unicode协会开发了Unicode项目。

在1991年先后,单方都认识到全国不需要两个不兼容的字符集。于是它们末尾分隔单方的任务成就,并为建树一个单一编码表而协同工作。从Unicode2.0最先,Unicode工程采用了与ISO 10646-1雷同的字库与字码。

目前两个工程仍都存在,并独立地颁发各自的规范。Unicode协会而今的最新版本是2005年的Unicode 4.1.0。ISO的最新尺度是ISO 10646-3:2003。

UCS只是规定若何编码,并没有划定若何传输、留存这个编码。比如"汉"字的UCS编码是6C49,我可以用4个ascii数字来传输、生涯这个编码;也能够用utf-8编码:3个间断的字节E6 B189来透露表现它。要害在于通信双方都要承认。UTF-8、UTF-7、UTF-16都是被遍及蒙受的方案。UTF-8的一个额定的优点是它与ISO-8859-1纯粹兼容。UTF是"UCS Transformation Format"的缩写。

IETF的RFC2781和RFC3629以RFC的一贯气势派头,清晰、明快又不失郑重地刻划了UTF-16和UTF-8的编码门径。我老是记不得IETF是网络 Engineering Task Force的缩写。但IETF卖力护卫的RFC是网络上一切规范的根抵。

2.1、内码与code page
目前Windows的内核也曾赞成Unicode字符集,如许在内核上可以赞成举世所有的语言文字。然而由于现有的多量步骤与文档都采纳了某种特定语言的编码,比喻GBK,Windows不可能不支持现有的编码,而全部改用Unicode。

Windows应用代码页(code page)来适应各个国度与区域。code page可以被理解为前面提到的内码。GBK对应的code page是CP936。

微软也为GB18030界说了code page:CP54936。然则由于GB18030有一一小块4字节编码,而Windows的代码页只赞成单字节与双字节编码,所以这个code page是没法真正应用的。

3、UCS-2、UCS-4、BMP
UCS有两种花色:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(理论上只用了31位,最高位必需为0)编码。上面让我们做一些容易的数学游戏:

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行采集256个cells。当然同一行的cells只不过收尾一个字节分歧,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。大约说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就取得了UCS-2。在UCS-2的两个字节前加上两个零字节,就获取了UCS-4的BMP。而目前的UCS-4规范中还不有任何字符被分拨在BMP之外。

4、UTF编码

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 10xxxxxx10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流按序庖代模板中的x,获取:1110011010110001 10001001,即E6 B1 89。

读者可以用记事本测试一下咱们的编码可否正确。需要留神,UltraEdit在翻开utf-8编码的文本文件时会积极转换为UTF-16,可能孕育发生搅浑。你可以在配置中关掉这个选项。更好的工具是Hex Workshop。

UTF-16以16位为单元对UCS发展编码。对付小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。关于不小于0x10000的UCS码,定义了一个算法。无非由于实际应用的UCS2,也许UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基原形似。但UCS-2只不过一个编码方案,UTF-16却要用于理论的传输,以是就不能不思索字节序的标题问题。

5、UTF的字节序与BOM
UTF-8以字节为编码单元,不有字节序的问题。UTF-16以两个字节为编码单位,在解释一个UTF-16文本前,首先要弄清晰每一个编码单位的字节序。譬如"奎"的Unicode编码是594E,"乙"的Unicode编码是4E59。如果咱们收到UTF-16字节流"594E",那么这是"奎"照常"乙"?

Unicode规范中引荐的符号字节顺序的方式是BOM。BOM不是"Bill Of Material"的BOM表,而是Byte order Mark。BOM是一个有点小伶俐的设法:

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAKSPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不具备的字符,所以不该该涌那时实践传输中。UCS规范首倡咱们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

何等如果领受者收到FEFF,就讲明这个字节流是Big-Endian的;如果收到FFFE,就解释这个字节流是Little-Endian的。因而字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来疏解字节顺序,但可以用BOM来剖明编码方式。字符"ZERO WIDTH NO-BREAKSPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码办法验证一下)。所以如果领受者收到以EF BBBF开首的字节流,就晓得这是UTF-8编码了。

Windows即是应用BOM来符号文本文件的编码方式的。

6、进一步的参考原料
本文主要参考的质料是 "Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。

我还找了两篇看下来不错的资料,不外由于我劈头劈脸的疑难都找到了答案,以是就不有看:

"Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a)
"Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03)
我写过UTF-8、UCS-2、GBK互相转换的软件包,包括运用Windows API和不使用Windows API的版本。之后有岁月的话,我会收拾整顿一下放到我的整体主页上

我是想清晰所有题目后才起源写这篇文章的,原以为一会儿就能写好。没想到思量语言与查证细节破钞了很耐久,居然从下昼1:30写到9:00。指望有读者能从中受益。

附录1 再说说区位码、GB2312、内码与代码页
有的朋侪对文章中这句话还有疑难:
"GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上别离加上A0。"

我再详细解释一下:

"GB2312的原文"是指国度1980年的一个标准《中华人民共和国国家尺度 动静互换用汉字编码字符集 基本集 GB2312-80》。这个尺度用两个数来编码汉字与中文符号。第一个数称为"区",第二个数喻为"位"。以是也称为区位码。1-9区是中文符号,16-55区是一级汉字,56-87区是二级汉字。现在Windows也尚有区位输入法,比方输出1601失掉"啊"。(这个区位输入法可以积极辨认16进制的GB2312和10进制的区位码,也等于说输入B0A1同样会获得"啊"。)

内码是指垄断琐细内部的字符编码。初期利用琐细的内码是与语言相关的。那会的Windows在系统内部支持Unicode,从此用代码页适应各类语言,"内码"的观念就比照含胡了。微软通常将缺省代码页指定的编码说成是内码。

内码这个词汇,并无甚么民间的定义,代码页也只不过微软这个公司的叫法。作为按次员,我们只有晓得它们是甚么器材,没有紧要过量地验证这些名词。

所谓代码页(code page)等于针对一种语言文字的字符编码。好比GBK的code page是CP936,BIG5的code page是CP950,GB2312的code page是CP20936。

Windows中出缺省代码页的概念,即缺省用什么编码来解释字符。比喻Windows的记事本掀开了一个文本文件,内中的内容是字节流:BA、BA、D7、D6。Windows应当去怎样解释它呢?

是依据Unicode编码解释、仍是依照GBK解释、照样根据BIG5解释,照样遵循ISO8859-1去解释?如果按GBK去解释,就会得到"汉字"两个字。遵照其它编码解释,可能找不到对应的字符,也可能找到舛讹的字符。所谓"谬误"是指与文本作者的本意不符,这时候就发生发火了乱码。

谜底是Windows根据当前的缺省代码页去解释文本文件里的字节流。缺省代码页可以经由管制面板的区域选项配置。记事本的另存为中有一项ANSI,的确便是遵照缺省代码页的编码方法保留。

Windows的内码是Unicode,它在技能上可以同时支持多个代码页。只需文件能注明本身运用甚么编码,用户又安装了对应的代码页,Windows就能正确显示,好比在HTML文件中就可以指定charset。

有的HTML文件作者,格外是英文作者,认为天下上所有人都使用英文,在文件中不指定charset。如果他应用了0x80-0xff之间的字符,中文Windows又遵照缺省的GBK去解释,就会呈现乱码。这时候只要在这个html文件中加之指定charset的语句,比喻:

如果原作者运用的代码页和ISO8859-1兼容,就不会呈现乱码了。

到此,关于"GBK、UTF8、GB2312和UTF-8的区别是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

编码 字节 字符 UTF-8 汉字 内码 两个 解释 代码 文件 中文 方式 语言 区位 符号 最高 区位码 尺度 方案 英文 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东网络安全工作室 数据库基础与实践技术 如何找到网络安全狗 集中式数据库的含义 济宁市科策网络技术 黑河市网络安全事件应急预案 数据库中的sql语言是 删除万方数据库论文价格 流媒体服务器管理系软件 网络安全日手抄报五年级高清图 日志服务器的作用 上海分布式服务器价格 通讯管理服务器无线核准认证 广东电商软件开发哪里有 如何破坏开票系统数据库 深圳初昕网络技术有限公司 专业网络安全案例技术原理 服务器热备设置 正泰预付费电表数据库修改 上海汉得软件开发工程师 我的世界如何开网络服务器 服务器上启用了增强的安全配置 华为网络技术工程师有前途吗 在数据库什么模型是一棵倒立树 乳腺癌筛查数据库 软件开发公司设计师 公安的网络安全辅助人员 赛季服哪些服务器开了安琪拉 3月15日网络安全手抄报 visual服务器怎么更新
0