如果UTF-8是8位编码,为什么它需要1-4个字节?

如何解决如果UTF-8是8位编码,为什么它需要1-4个字节?

| 在Unicode网站上写道,UTF-8可以用1-4个字节表示。据我从这个问题可以理解,https://softwareengineering.stackexchange.com/questions/77758/why-are-there-multiple-unicode-encodings UTF-8是一种8位编码。 那么,真相是什么? 如果是8位编码,那么ASCII和UTF-8有什么区别? 如果不是,那么为什么将它称为UTF-8?如果它们占用相同的内存,为什么我们需要UTF-16和其他代码?     

解决方法

        每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集(无借口!)作者:Joel Spolsky-2003年10月8日,星期三 摘录自:   因此发明了UTF-8的出色概念。 UTF-8是另一个使用8位字节将Unicode代码点的字符串(那些神奇的U +数字)存储在内存中的系统。在UTF-8中,从0-127的每个代码点都存储在一个字节中。实际上,只有代码点128和更高的代码点才使用2、3(最多6个字节)存储。   这样做的好处是,英语文本在UTF-8中的外观与在ASCII中的外观完全相同,因此美国人甚至不会发现任何错误。只有世界其他地方才可以跳过障碍。具体来说,Hello,即U + 0048 U + 0065 U + 006C U + 006C U + 006F,将被存储为48 65 6C 6C 6F,这是!与存储在ASCII和ANSI中以及地球上每个OEM字符集相同。现在,如果您大胆使用重音字母,希腊字母或克林贡字母,则必须使用多个字节来存储单个代码点,但美国人永远不会注意到。 (UTF-8还具有不错的属性,即希望使用单个0字节作为空终止符的无知的旧字符串处理代码不会截断字符串)。      到目前为止,我已经告诉您三种编码Unicode的方法。传统的“两字节存储”方法称为UCS-2(因为它有两个字节)或UTF-16(因为它有16位),您仍然必须弄清楚它是否高endian UCS-2或低端UCS-2。而且,流行的新UTF-8标准具有很好的特性,如果英语文本和Braindead程序的巧合完全没有引起人们的注意,那么ASCII也可以正常工作。      实际上,还有许多其他编码Unicode的方式。有一个叫做UTF-7的东西,它很像UTF-8,但是保证高位始终为零,因此,如果您必须通过认为是7的严酷的警察状态电子邮件系统传递Unicode,足够多了,谢谢,它仍然可以毫发无损地挤过。 UCS-4具有将每个代码点存储在4个字节中的功能,它具有一个很好的特性,即每个单个代码点都可以存储在相同数量的字节中,但是,天哪,即使是德州人也不会那样做大胆地浪费那么多内存。      实际上,现在您正在考虑用Unicode代码点表示的柏拉图式理想字母来思考事物,那些unicode代码点也可以用任何老式的编码方案进行编码!例如,您可以使用ASCII编码Hello(U + 0048 U + 0065 U + 006C U + 006C U + 006F)的Unicode字符串,或者使用旧的OEM希腊编码,希伯来ANSI编码或数百种编码中的任何一种到现在为止已经发明了,只有一个问题:有些字母可能不会出现!如果您要表示的Unicode代码点中没有与之等效的代码,通常会出现一个问号:或者,如果您真的很好,那就放一个盒子。你得到了什么? ->�      有数百种传统编码,它们只能正确存储一些代码点,而将所有其他代码点更改为问号。某些流行的英语文本编码是Windows-1252(西欧语言的Windows 9x标准)和ISO-8859-1,又名Latin-1(对任何西欧语言也有用)。但是,尝试以这些编码存储俄语或希伯来语字母,则会出现很多问号。 UTF 7、8、16和32都具有能够正确存储任何代码点的优点。     ,“ 8位”编码表示编码的各个字节使用8位。相比之下,纯ASCII是7位编码,因为它只有代码点0-127。过去,该软件在8位编码方面存在问题;使用Base-64和uuencode编码的原因之一是通过未处理8位编码的电子邮件系统获取二进制数据。但是,距那已经不再是一个问题,已经过去了十年或更长时间-软件必须是8位纯净的,或者能够处理8位编码的。 Unicode本身是一个21位字符集。它有多种编码: UTF-32,其中每个Unicode代码点均以32位整数存储 在UTF-16中,许多Unicode代码点存储在单个16位整数中,但有些需要两个16位整数(因此每个Unicode代码点需要2或4个字节)。 UTF-8中的Unicode代码点可能需要1、2、3或4个字节来存储单个Unicode代码点。 因此,“ UTF-8可以由1-4个字节表示”可能不是最合适的措辞方式。 \“ Unicode代码点可以用UTF-8中的1-4个字节表示\”会更合适。     ,        UTF-8是8位可变宽度编码。 Unicode中的前128个字符用UTF-8编码表示时,表示形式为ASCII字符。 为了进一步理解这一点,Unicode将字符视为代码点-可以以多种方式(编码)表示的纯数字。 UTF-8是一种这样的编码。它是最常用的,因为它在所有编码中提供了最佳的空间消耗特性。如果您以UTF-8编码存储来自ASCII字符集的字符,那么UTF-8编码的数据将占用相同的空间。这允许以前使用ASCII的应用程序无缝地移动(嗯,虽然不完全,但是肯定不会导致类似Y2K的问题)移动到Unicode,因为字符表示是相同的。 我将在RFC 3629中保留有关UTF-8编码工作原理的摘录:
   Char. number range  |        UTF-8 octet sequence
      (hexadecimal)    |              (binary)
   --------------------+---------------------------------------------
   0000 0000-0000 007F | 0xxxxxxx
   0000 0080-0000 07FF | 110xxxxx 10xxxxxx
   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
您会注意到,为什么编码会导致字符占据Unicode(左列)中不同字符范围的1-4个字节(右列)之间的任意位置。 UTF-16,UTF-32,UCS-2等将采用不同的编码方案,其中的代码点将表示为16位或32位代码,而不是UTF-8表示的8位代码。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-