贵阳建站推广公司蜘蛛搜索引擎

news/2025/9/26 14:34:38/文章来源:
贵阳建站推广公司,蜘蛛搜索引擎,建设彩票开奖网站,蓝色扁平化企业网站字符编码的问题看似很小#xff0c;经常被技术人员忽视#xff0c;但是很容易导致一些莫名其妙的问题。这里总结了一下字符编码的一些普及性的知识#xff0c;希望对大家有所帮助。 还是得从ASCII码说起 说到字符编码#xff0c;不得不说ASCII码的简史。计算机一开始发明…字符编码的问题看似很小经常被技术人员忽视但是很容易导致一些莫名其妙的问题。这里总结了一下字符编码的一些普及性的知识希望对大家有所帮助。 还是得从ASCII码说起 说到字符编码不得不说ASCII码的简史。计算机一开始发明的时候是用来解决数字计算的问题后来人们发现计算机还可以做更多的事例如文本处理。但由于计算机只识“数”因此人们必须告诉计算机哪个数字来代表哪个特定字符例如65代表字母‘A’66代表字母‘B’以此类推。但是计算机之间字符-数字的对应关系必须得一致否则就会造成同一段数字在不同计算机上显示出来的字符不一样。因此美国国家标准协会ANSI制定了一个标准规定了常用字符的集合以及每个字符对应的编号这就是ASCII字符集Character Set也称ASCII码。 当时的计算机普遍使用8比特字节作为最小的存储和处理单元加之当时用到的字符也很少26个大小写英文字母还有数字再加上其他常用符号也不到100个因此使用7个比特位就可以高效的存储和处理ASCII码剩下最高位1比特被用作一些通讯系统的奇偶校验。 注意字节代表系统能够处理的最小单位不一定是8比特。只是现代计算机的事实标准就是用8比特来代表一个字节。在很多技术规格文献中为了避免产生歧义更倾向于使用8位组Octet而不是字节Byte这个术语来强调8个比特的二进制流。下文中为了便于理解我会延用大家熟悉的“字节”这个概念。 ASCII字符集由95个可打印字符0x20-0x7E和33个控制字符0x00-0x190x7F组成。可打印字符用于显示在输出设备上例如荧屏或者打印纸上控制字符用于向计算机发出一些特殊指令例如0x07会让计算机发出哔的一声0x00通常用于指示字符串的结束0x0D和0x0A用于指示打印机的打印针头退到行首回车并移到下一行换行。 那时候的字符编解码系统非常简单就是简单的查表过程。例如将字符序列编码为二进制流写入存储设备只需要在ASCII字符集中依次找到字符对应的字节然后直接将该字节写入存储设备即可。解码二进制流的过程也是类似。 OEM字符集的衍生 当计算机开始发展起来的时候人们逐渐发现ASCII字符集里那可怜的128个字符已经不能再满足他们的需求了。人们就在想一个字节能够表示的数字编号有256个而ASCII字符只用到了0x00~0x7F也就是占用了前128个后面128个数字不用白不用因此很多人打起了后面这128个数字的主意。可是问题在于很多人同时有这样的想法但是大家对于0x80-0xFF这后面的128个数字分别对应什么样的字符却有各自的想法。这就导致了当时销往世界各地的机器上出现了大量各式各样的OEM字符集。 下面这张表是IBM-PC机推出的其中一个OEM字符集字符集的前128个字符和ASCII字符集的基本一致为什么说基本一致呢是因为前32个控制字符在某些情况下会被IBM-PC机当作可打印字符解释后面128个字符空间加入了一些欧洲国家用到的重音字符以及一些用于画线条画的字符。 事实上大部分OEM字符集是兼容ASCII字符集的也就是说大家对于0x00~0x7F这个范围的解释基本是相同的而对于后半部分0x80~0xFF的解释却不一定相同。甚至有时候同样的字符在不同OEM字符集中对应的字节也是不同的。 不同的OEM字符集导致人们无法跨机器交流各种文档。例如职员甲发了一封简历résumés给职员乙结果职员乙看到的却是rsums因为é字符在职员甲机器上的OEM字符集中对应的字节是0x82而在职员乙的机器上由于使用的OEM字符集不同对0x82字节解码后得到的字符却是 多字节字符集MBCS和中文字符集 上面我们提到的字符集都是基于单字节编码也就是说一个字节翻译成一个字符。这对于拉丁语系国家来说可能没有什么问题因为他们通过扩展第8个比特就可以得到256个字符了足够用了。但是对于亚洲国家来说256个字符是远远不够用的。因此这些国家的人为了用上电脑又要保持和ASCII字符集的兼容就发明了多字节编码方式相应的字符集就称为多字节字符集。例如中国使用的就是双字节字符集编码DBCSDouble Byte Character Set。 对于单字节字符集来说代码页中只需要有一张码表即可上面记录着256个数字代表的字符。程序只需要做简单的查表操作就可以完成编解码的过程。 代码页是字符集编码的具体实现你可以把他理解为一张“字符-字节”映射表通过查表实现“字符-字节”的翻译。下面会有更详细的描述。 而对于多字节字符集代码页中通常会有很多码表。那么程序怎么知道该使用哪张码表去解码二进制流呢答案是根据第一个字节来选择不同的码表进行解析。 例如目前最常用的中文字符集GB2312涵盖了所有简体字符以及一部分其他字符GBKK代表扩展的意思则在GB2312的基础上加入了对繁体字符等其他非简体字符GB18030字符集不是双字节字符集我们在讲Unicode的时候会提到。这两个字符集的字符都是使用1-2个字节来表示。Windows系统采用936代码页来实现对GBK字符集的编解码。在解析字节流的时候如果遇到字节的最高位是0的话那么就使用936代码页中的第1张码表进行解码这就和单字节字符集的编解码方式一致了。 当字节的高位是1的时候确切的说当第一个字节位于0x81–0xFE之间时根据第一个字节不同找到代码页中的相应的码表例如当第一个字节是0x81那么对应936中的下面这张码表 关于936代码页中完整的码表信息参见MSDNhttp://msdn.microsoft.com/en-us/library/cc194913%28vMSDN.10%29.aspx. 按照936代码页的码表当程序遇到连续字节流0x81 0x40的时候就会解码为“丂”字符。 ANSI标准、国家标准、ISO标准 不同ASCII衍生字符集的出现让文档交流变得非常困难因此各种组织都陆续进行了标准化流程。例如美国ANSI组织制定了ANSI标准字符编码注意我们现在通常说到ANSI编码通常指的是平台的默认编码例如英文操作系统中是ISO-8859-1中文系统是GBKISO组织制定的各种ISO标准字符编码还有各国也会制定一些国家标准字符集例如中国的GBKGB2312和GB18030。 操作系统在发布的时候通常会往机器里预装这些标准的字符集还有平台专用的字符集这样只要你的文档是使用标准字符集编写的通用性就比较高了。例如你用GB2312字符集编写的文档在中国大陆内的任何机器上都能正确显示。同时我们也可以在一台机器上阅读多个国家不同语言的文档了前提是本机必须安装该文档使用的字符集。 Unicode的出现 虽然通过使用不同字符集我们可以在一台机器上查阅不同语言的文档但是我们仍然无法解决一个问题在一份文档中显示所有字符。为了解决这个问题我们需要一个全人类达成共识的巨大的字符集这就是Unicode字符集。 Unicode字符集概述 Unicode字符集涵盖了目前人类使用的所有字符并为每个字符进行统一编号分配唯一的字符码Code Point。Unicode字符集将所有字符按照使用上的频繁度划分为17个层面Plane每个层面上有21665536个字符码空间。 其中第0个层面BMP基本涵盖了当今世界用到的所有字符。其他的层面要么是用来表示一些远古时期的文字要么是留作扩展。我们平常用到的Unicode字符一般都是位于BMP层面上的。目前Unicode字符集中尚有大量字符空间未使用。 编码系统的变化 在Unicode出现之前所有的字符集都是和具体编码方案绑定在一起的都是直接将字符和最终字节流绑定死了例如ASCII编码系统规定使用7比特来编码ASCII字符集GB2312以及GBK字符集限定了使用最多2个字节来编码所有字符并且规定了字节序。这样的编码系统通常用简单的查表也就是通过代码页就可以直接将字符映射为存储设备上的字节流了。例如下面这个例子 这种方式的缺点在于字符和字节流之间耦合得太紧密了从而限定了字符集的扩展能力。假设以后火星人入住地球了要往现有字符集中加入火星文就变得很难甚至不可能了而且很容易破坏现有的编码规则。 因此Unicode在设计上考虑到了这一点将字符集和字符编码方案分离开。 也就是说虽然每个字符在Unicode字符集中都能找到唯一确定的编号字符码又称Unicode码但是决定最终字节流的却是具体的字符编码。例如同样是对Unicode字符“A”进行编码UTF-8字符编码得到的字节流是0x41而UTF-16大端模式得到的是0x00 0x41。 常见的Unicode编码 UCS-2/UTF-16 如果要我们来实现Unicode字符集中BMP字符的编码方案我们会怎么实现由于BMP层面上有21665536个字符码因此我们只需要两个字节就可以完全表示这所有的字符了。 举个例子“中”的Unicode字符码是0x4E2D(01001110 00101101)那么我们可以编码为01001110 00101101大端或者00101101 01001110 小端。 UCS-2和UTF-16对于BMP层面的字符均是使用2个字节来表示并且编码得到的结果完全一致。不同之处在于UCS-2最初设计的时候只考虑到BMP字符因此使用固定2个字节长度也就是说他无法表示Unicode其他层面上的字符而UTF-16为了解除这个限制支持Unicode全字符集的编解码采用了变长编码最少使用2个字节如果要编码BMP以外的字符则需要4个字节结对这里就不讨论那么远有兴趣可以参考维基百科UTF-16/UCS-2。 Windows从NT时代开始就采用了UTF-16编码很多流行的编程平台例如.NetJavaQt还有Mac下的Cocoa等都是使用UTF-16作为基础的字符编码。例如代码中的字符串在内存中相应的字节流就是用UTF-16编码过的。 UTF-8 UTF-8应该是目前应用最广泛的一种Unicode编码方案。由于UCS-2/UTF-16对于ASCII字符使用两个字节进行编码存储和处理效率相对低下并且由于ASCII字符经过UTF-16编码后得到的两个字节高字节始终是0x00很多C语言的函数都将此字节视为字符串末尾从而导致无法正确解析文本。因此一开始推出的时候遭到很多西方国家的抵触大大影响了Unicode的推行。后来聪明的人们发明了UTF-8编码解决了这个问题。 UTF-8编码方案采用1-4个字节来编码字符方法其实也非常简单。 上图中的x代表Unicode码的低8位y代表高8位 对于ASCII字符的编码使用单字节和ASCII编码一摸一样这样所有原先使用ASCII编解码的文档就可以直接转到UTF-8编码了。对于其他字符则使用2-4个字节来表示其中首字节前置1的数目代表正确解析所需要的字节数剩余字节的高2位始终是10。例如首字节是1110yyyy前置有3个1说明正确解析总共需要3个字节需要和后面2个以10开头的字节结合才能正确解析得到字符。 关于UTF-8的更多信息参考维基百科UTF-8。 GB18030 任何能够将Unicode字符映射为字节流的编码都属于Unicode编码。中国的GB18030编码覆盖了Unicode所有的字符因此也算是一种Unicode编码。只不过他的编码方式并不像UTF-8或者UTF-16一样将Unicode字符的编号通过一定的规则进行转换而只能通过查表的手段进行编码。 关于GB18030的更多信息参考GB18030。 Unicode相关的常见问题 Unicode是两个字节吗 Unicode只是定义了一个庞大的、全球通用的字符集并为每个字符规定了唯一确定的编号具体存储为什么样的字节流取决于字符编码方案。推荐的Unicode编码是UTF-16和UTF-8。 带签名的UTF-8指的是什么意思 带签名指的是字节流以BOM标记开始。很多软件会“智能”的探测当前字节流使用的字符编码这种探测过程出于效率考虑通常会提取字节流前面若干个字节看看是否符合某些常见字符编码的编码规则。由于UTF-8和ASCII编码对于纯英文的编码是一样的无法区分开来因此通过在字节流最前面添加BOM标记可以告诉软件当前使用的是Unicode编码判别成功率就十分准确了。但是需要注意不是所有软件或者程序都能正确处理BOM标记例如PHP就不会检测BOM标记直接把它当普通字节流解析了。因此如果你的PHP文件是采用带BOM标记的UTF-8进行编码的那么有可能会出现问题。 Unicode编码和以前的字符集编码有什么区别 早期字符编码、字符集和代码页等概念都是表达同一个意思。例如GB2312字符集、GB2312编码936代码页实际上说的是同个东西。但是对于Unicode则不同Unicode字符集只是定义了字符的集合和唯一编号Unicode编码则是对UTF-8、UCS-2/UTF-16等具体编码方案的统称而已并不是具体的编码方案。所以当需要用到字符编码的时候你可以写gb2312codepage936utf-8utf-16但请不要写unicode看过别人在网页的meta标签里头写charsetunicode有感而发。 乱码问题 乱码指的是程序显示出来的字符文本无法用任何语言去解读。一般情况下会包含大量?或者。乱码问题是所有计算机用户或多或少会遇到的问题。造成乱码的原因就是因为使用了错误的字符编码去解码字节流因此当我们在思考任何跟文本显示有关的问题时请时刻保持清醒当前使用的字符编码是什么。只有这样我们才能正确分析和处理乱码问题。 例如最常见的网页乱码问题。如果你是网站技术人员遇到这样的问题需要检查以下原因 服务器返回的响应头Content-Type没有指明字符编码网页内是否使用META HTTP-EQUIV标签指定了字符编码网页文件本身存储时使用的字符编码和网页声明的字符编码是否一致  注意网页解析的过程如果使用的字符编码不正确还可能会导致脚本或者样式表出错。具体细节可以参考我以前写过的文章文档字符集导致的脚本错误和Asp.Net页面的编码问题。 不久前看到某技术论坛有人反馈WinForm程序使用Clipboard类的GetData方法去访问剪切板中的HTML内容时会出现乱码的问题我估计也是由于WinForm在获取HTML文本的时候没有用对正确的字符编码导致的。Windows剪贴板只支持UTF-8编码也就是说你传入的文本都会被UTF-8编解码。这样一来只要两个程序都是调用Windows剪切板API编程的话那么复制粘贴的过程中不会出现乱码。除非一方在获取到剪贴板数据之后使用了错误的字符编码进行解码才会得到乱码我做了简单的WinForm剪切板编程实验发现GetData使用的是系统默认编码而不是UTF-8编码。 关于乱码中出现?或者这里需要额外提一下当程序使用特定字符编码解析字节流的时候一旦遇到无法解析的字节流时就会用?或者来替代。因此一旦你最终解析得到的文本包含这样的字符而你又无法得到原始字节流的时候说明正确的信息已经彻底丢失了尝试任何字符编码都无法从这样的字符文本中还原出正确的信息来。 必要的术语解释 字符集Character Set字面上的理解就是字符的集合例如ASCII字符集定义了128个字符GB2312定义了7445个字符。而计算机系统中提到的字符集准确来说指的是已编号的字符的有序集合不一定是连续。 字符码Code Point指的就是字符集中每个字符的数字编号。例如ASCII字符集用0-127这连续的128个数字分别表示128个字符GBK字符集使用区位码的方式为每个字符编号首先定义一个94X94的矩阵行称为“区”列称为“位”然后将所有国标汉字放入矩阵当中这样每个汉字就可以用唯一的“区位”码来标识了。例如“中”字被放到54区第48位因此字符码就是5448。而Unicode中将字符集按照一定的类别划分到0~16这17个层面Planes中每个层面中拥有21665536个字符码因此Unicode总共拥有的字符码也即是Unicode的字符空间总共有17*655361114112。 编码的过程是将字符转换成字节流。 解码的过程是将字节流解析为字符。 字符编码Character Encoding是将字符集中的字符码映射为字节流的一种具体实现方案。例如ASCII字符编码规定使用单字节中低位的7个比特去编码所有的字符。例如‘A’的编号是65用单字节表示就是0x41因此写入存储设备的时候就是b’01000001’。GBK编码则是将区位码GBK的字符码中的区码和位码的分别加上0xA0160的偏移之所以要加上这样的偏移主要是为了和ASCII码兼容例如刚刚提到的“中”字区位码是5448十六进制是0x3630区码和位码分别加上0xA0的偏移之后就得到0xD6D0这就是“中”字的GBK编码结果。 代码页Code Page一种字符编码具体形式。早期字符相对少因此通常会使用类似表格的形式将字符直接映射为字节流然后通过查表的方式来实现字符的编解码。现代操作系统沿用了这种方式。例如Windows使用936代码页、Mac系统使用EUC-CN代码页实现GBK字符集的编码名字虽然不一样但对于同一汉字的编码肯定是一样的。 大小端的说法源自《格列佛游记》。我们知道鸡蛋通常一端大一端小小人国的人们对于剥蛋壳时应从哪一端开始剥起有着不一样的看法。同样计算机界对于传输多字节字由多个字节来共同表示一个数据类型时是先传高位字节大端还是先传低位字节小端也有着不一样的看法这就是计算机里头大小端模式的由来了。无论是写文件还是网络传输实际上都是往流设备进行写操作的过程而且这个写操作是从流的低地址向高地址开始写这很符合人的习惯对于多字节字来说如果先写入高位字节则称作大端模式。反之则称作小端模式。也就是说大端模式下字节序和流设备的地址顺序是相反的而小端模式则是相同的。一般网络协议都采用大端模式进行传输。 ——Kevin Yang 参考链接 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)http://developers.sun.com/dev/gadc/technicalpublications/articles/gb18030.htmlhttp://en.wikipedia.org/wiki/Universal_Character_Sethttp://en.wikipedia.org/wiki/Code_page 分类: 技术随笔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

庐江魅力网做网站号码成都网站开发

物理建模是四旋翼无人机控制系统建模的基础,主要涉及到无人机的物理特性和运动学特性。物理建模的目的是将无人机的运动与输入信号(如控制电压)之间的关系进行数学描述。 四旋翼无人直升机是具有四个输入力和六个坐标输出的欠驱动动力学旋翼…

做网站时,404网页如何指向wordpress weather

Java中的适配器模式(Adapter Pattern)是一种设计模式,它允许我们将一种类的接口转换成另一种类的接口,以便于使用。适配器模式通常用于在不兼容的接口之间提供一种过渡性的接口,从而使代码更加灵活和可维护。 在Java中…

包装盒在线设计网站二级子域名ip地址查询

http和https区别 HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是用于在网络上传输数据的两种协议。它们之间的主要区别在于安全性和数据传输方式: 安全性:HTTP是明文传…

docker 镜像/容器

根据镜像启动容器,并进入容器: docker run -it --privileged --entrypoint bash 镜像名特性Docker 镜像Docker 容器本质 只读的模板或快照。包含创建容器所需的文件和元数据。 镜像的运行实例。是一个可写的、隔离的…

jmeter命令行参数详细解释

1. 帮助与版本信息 -h, --help: 显示 JMeter 的使用帮助信息并退出程序 -v, --version: 显示 JMeter 的版本信息并退出程序2. 配置文件相关 -p, --propfile <argument>: 指定 JMeter 要使用的属性文件 -q, --add…

RK3399:性能与能效的嵌入式先锋,解锁多场景应用潜力

在寻求卓越性能与出色能效平衡的嵌入式计算和智能设备领域,瑞芯微(Rockchip)推出的 RK3399 处理器无疑是一个耀眼的明星。这款基于ARM架构的旗舰级SoC(System-on-Chip),凭借其强大的六核CPU、优秀的图形处理能力…

【C++STL详解】带头双向循环结构 + 双向迭代器,核心接口 + 排序效率 + 避坑指南 - 教程

【C++STL详解】带头双向循环结构 + 双向迭代器,核心接口 + 排序效率 + 避坑指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

学做视频的网站有哪些window7用jsp做的网站要什么工具

距离vue3.3发布已经过了一年多(2023.5.11),vue3.3提高开发体验的新特性你用了吗&#xff1f; 组件内部导入复杂类型 3.3之前想在组件内部导入复杂类型做props类型是不支持的。 <script setup lang"ts">import type { People } from /types;withDefaults(define…

Node.js后端学习笔记:Express+MySQL - 指南

Node.js后端学习笔记:Express+MySQL - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

TorchV知识库安全解决方案:基于智能环境感知的动态权限控制

TorchV知识库安全解决方案:基于智能环境感知的动态权限控制在数据即资产的时代,企业知识库的安全不再仅限于“用户名和密码”。TorchV带来的是一种全新的安全范式——让环境成为新的安全边界。————TorchV舒一笑不…

详细介绍:Java HTTP协议(二)--- HTTPS,Tomcat

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

VBA ETH功能应用 | “0”代码构建SOME/IP节点

在智能汽车飞速发展的今天,车载以太网通信已成为功能服务化的核心驱动力。工程师在控制器开发、通信集成和测试验证中,常常面临SOMEIP协议交互的复杂挑战:SD过程繁琐、SessionID等字段具有变化逻辑、纯手动构造二层…

ISUP协议视频平台EasyCVR在智慧灯杆综合管理中的应用

ISUP协议视频平台EasyCVR在智慧灯杆综合管理中的应用智慧城市的迅猛发展带动了智慧灯杆综合管理平台的兴起,平台作为城市基础设施智能化的关键组成部分,日益彰显其在城市管理和公共服务领域的显著优势。通过整合多样…

视觉智能赋能产业数智化升级:JBoltAI多模态技术落地实践

视觉智能赋能产业数智化升级:JBoltAI多模态技术落地实践一、多模态技术:企业数智化转型的新引擎当前,全球产业正面临着一个共同挑战:如何将海量的非结构化数据转化为可操作的商业智能。传统企业系统中,大量信息以…

神秘考试题

题意 有一个长度为 \(n\) 的序列 \(a\),你需要求出: \[\sum_{i = 1}^n \sum_{j = 1}^n (a_i \text{and} a_j)(a_i \text{or} a_j)(a_i \text{xor} a_j) \]solution 首先对于每个结果拆位,也就是对于原式中的三项,我…

Solon v3.4.6, v3.5.4, v3.6.0-M1 发布。正式开始 LTS 计划

Solon 是新一代 Java 企业级应用开发框架,采用 Apache 2.0 开源协议。相比 Spring,Solon 在计算性价比、开发效率、生产部署等方面优势明显,并发性能提升 700%,内存节省 50%,启动速度快 10 倍,同时兼容 Java 8-2…

串口通信、阻塞与非阻塞、qt

【问题】当自己码完收发代码之后,确收、发不成功串口数据。 【解题思路】在确保代码无误的情况下,很可能是阻塞与非阻塞通信的区别。所以,需要分别尝试实现阻塞与非阻塞的方式进行测试。 【深层次原因理解】拿qt工程…

网站建设运营案例怎样做app网站建设

promise请求数据用法 Promise简介 Promise 是异步编程的一种解决方案&#xff0c;比传统的解决方案–回调函数和事件&#xff0d;&#xff0d;更合理和更强大。ES6将其写进了语言标准&#xff0c;统一了语法&#xff0c;里面保存着某个未来才回结束的事件(通常是一个异步操作&a…

织梦网站底端的怎么删除满足seo需求的网站

提示&#xff1a;今日是2024年的6月30日&#xff0c;未来的你看到这篇文章&#xff0c;希望你依旧快乐 文章目录 前言 首先在这里前缀部分我就不做要求了,比如说登录信息什么的 数据库表格 这里实现点赞功能&#xff0c;主要是围绕论坛项目完成的 user_info代表用户信息表 for…