热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

字符ascii码值转换_LunaTech|CharacterEncoding(字符编码)1

0.前言上一篇讲完Base64Encoding[1]之后,我对编码产生了浓厚的兴趣,所以这篇继续来聊聊编码。1.MorseCode(摩尔斯电码)最早的电

33050bd5e349ac19010466f20334da3e.png


0. 前言

上一篇讲完 Base64 Encoding[1] 之后,我对编码产生了浓厚的兴趣,所以这篇继续来聊聊编码。


1. Morse Code(摩尔斯电码)

最早的电信编码是Morse Code[2] (摩尔斯电码[3] - 发明于 1836 年),国际通用的 Morse Code 有以下 5 个元素(可以想象成 5 进制):

  1. 点:1
  2. 线(划):111
  3. 点和线(划)之间的时间间隔为 1 单位:0
  4. 字母之间的时间间隔为 3 单位:000
  5. 单词之间的时间间隔为 7 单位:0000000

Morse Code 可以把英文字母、数字、标点符号用以上 5 个元素编码之后进行传输。Morse Code 属于字符编码的鼻祖,它的传输方式可以是灯光、无线电、声波等。

Morse Code 经常出现在影视作品里面,比如电影《寄生虫》,找到一篇相关文章,挺有意思的(如何用摩尔斯电码发韩语[4])。

中文电码[5]比较复杂,1873 年的时候有个法国人挑了 6800 多个常用汉字,编成了第一部汉字电码本《电报新书》。

中文电码表一开始是从 0000-9999 表示 1 万个汉字,后来发现不够用,又增加了一倍。


2. Character Encoding(字符编码)

在计算机领域,Character Encoding[6](字符编码)的目的是则把字符变成二进制的 01 进行传输。

字符编码常用术语

  • character(字符):有语义的最小单位字符;
  • character set(字符集):多个字符组成的集合,可能被多种语言使用,比如 Latin character set(拉丁字符集)被用于英文和大部分的欧洲语言;
  • coded character set(简称 CCS,编码字符集):每个字符编码后成为一个独特的数字;
  • code unit(码元):把每个字符通过一个特定的编码形式转化成 bit 流,有些地方也称之为 code value(码值);
  • code space(编码空间):编码的整数区间(比如 8-bit 就是 00000000-11111111)
  • code point(码位):字符集或编码空间中的任意一个值(比如 00000000 就是一个码位);

PS:翻译有可能不准,可以参考原文。

  • A character is a minimal unit of text that has semantic value.
  • A character set is a collection of characters that might be used by multiple languages. Example: The Latin character set is used by English and most European languages, though the Greek character set is used only by the Greek language.
  • A coded character set is a character set in which each character corresponds to a unique number.
  • A code point of a coded character set is any allowed value in the character set or code space.
  • A code space is a range of integers whose values are code points
  • A code unit is a bit sequence used to encode each character of a repertoire within a given encoding form. This is referred to as a code value in some documents.

HTTP 和 MIME 语境

  • character set = character encoding(字符集=字符编码)
  • character set ≠ coded character set(字符集 ≠ 编码后的字符集)

A "character set" in HTTP[7] (and MIME[8]) parlance is the same as a character encoding (but not the same as CCS).

https://en.wikipedia.org/wiki/Character_encoding

常见码元(Code Unit)

  1. US-ASCII:7-bit
  2. UTF-8, EBCDIC[9], GB 18030[10]:8-bit
  3. UTF-16: 16-bit
  4. UTF-32: 32-bit

接下来我们先看看 7-bit 的 US-ASCII。


3. US-ASCII(美国信息交换标准代码)

ASCII[11] (American Standard Code for Information Interchange), is a character encoding standard for electronic communication. ASCII codes represent text in computers, telecommunications equipment, and other devices. Most modern character-encoding schemes are based on ASCII, although they support many additional characters.

ASCII 简介

  1. 出生于 1960 年代,中文名【美国标准信息交换码】;
  2. 一种早期的编码格式,把符号变成 01;
  3. 支持 7-bit 编码(128 个字符);
  4. 缺陷:只支持英文和基本的符号(比如空格,换行),不支持其他语言和符号(128 个编码不够用了= =);

128 还是 127?

在某些文章里面看到这样的表述:【ASCII 对应的是 127 个字符】,我思考了一下,这个计算方式应该是人为忽略了 0 。在 ASCII 表格里面,0 代表虚无(NULL)的意思,有些人可能因此把它排除掉了。

我认为还是说 128 比较严谨,毕竟是 2 的 7 次方。

0e6b2cfd21ef77be0871da6e164da530.png

7-bit 还是 8-bit?

还有一些文章会说 ASCII 是 8-bit 编码,这也是不准确的表述。8-bit 的 ASCII 是我们接下来要讲的 EASCII。虽然 EASCII 是 ASCII 的变体,但不能简单地把 ASCII 等同于 8-bit 编码。


4. Extended ASCII(EASCII)

1970 年代,计算机行业开始普遍接受 1 Byte = 8 bit 的设定,在这个背景下,ASCII 也要升级成 8-bit,于是大家就搞起了 Extended ASCII.

冷知识:Octet[12](八字节)是一种更精确地表示 Byte 的说法。

When computers and peripherals standardized on eight-bit bytes in the 1970s, it became obvious that computers and software could handle text that uses 256-character sets at almost no additional cost in programming, and no additional cost for storage. (Assuming that the unused 8th bit of each byte was not reused in some way, such as error checking, Boolean fields, or packing 8 characters into 7 bytes.) This would allow ASCII to be used unchanged and provide 128 more characters.

Eventually, as 8-, 16- and 32-bit (and later 64-bit) computers began to replace 12-, 18- and 36-bit computers as the norm, it became common to use an 8-bit byte to store each character in memory, providing an opportunity for extended, 8-bit relatives of ASCII. In most cases these developed as true extensions of ASCII, leaving the original character-mapping intact, but adding additional character definitions after the first 128 (i.e., 7-bit) characters.

EASCII 简介

  1. 出生于 1970 年代,中文名【延伸美国标准信息交换码】;

  2. 扩展方式:从 7-bit 升级成了 8-bit

    ASCII 定义的那些字符,统一在最前面增加一个 0;

    EASCII[13] 的扩展字符有 128 个(129-256);

    EASCII 的规则是,增加的 128 个扩展字符只能被用于文字,不能被用于标签、关键词或者其他对于解释器来说有特殊意义的地方;

  3. 增加哪 128 个字符呢?

    这个就有意思了,不同的计算机厂商、不同的国家地区都有自己的版本;

    比较常见的一种是ISO/IEC 8859-1[14],又称 Latin-1 或西欧语言;

    还有一种常用的编码表是 Windows-1252[15],但这个编码表从来没有成为正式的 ANSI[16] 标准;

    Windows-1252 编码表链接:https://www.ascii-code.com/

Although these encodings (ISCII, VISCII) are sometimes referred to as ASCII, true ASCII is defined strictly only by the ANSI standard.

There are many extended ASCII encodings (more than 220 DOS and Windows codepages).

In the range 128 to 159 (hex 80 to 9F), ISO/IEC 8859-1 has invisible control characters, while Windows-1252 has writable characters.

例 1

编码方式符号结果(2 进制)结果(10 进制)
ASCIIA100000165
EASCIIA0100000165

例 2 - 基于 Latin-1

编码方式符号结果(2 进制)结果(10 进制)
ASCII¥查无此人查无此人
EASCII¥10100101165

ESACII 是一个标准编码方式吗?

首先,EASCII 只是 ASCII 的扩展版,这个扩展版有很多不同的版本;

所以,EASCII 不是一个唯一的固定的编码标准,它只是对于基于 ASCII 扩展之后的 8-bit 编码的一个统称

你有没有注意到,我们说常见码元的时候,里面并没有 EASCII?

另外,人们提到 EASCII,往往说的是其中的一个版本(比如 ISO/IEC 8859,UTF-8),没有人会直接说 EASCII,因为实在是太多种了。

Multi-byte character encodings(多字节字符编码)

由于 8-bit 只能代表 256 个不同的字符,超过 256 个怎么办呢?那我们就用多个 8-bit 来表示多出来的字符吧~

这样的编码方式就被称作 Multi-byte character encodings,它是 variable-width encoding(可变长度编码)的一种最常见形式。

假如编码的时候所有属于 ASCII 的字符都用一样的码位,而且这些码位只用于 ASCII 表格里面所定义的字符,那么这种多字节字符编码方式就被称作"真正的 EASCII",比如 UTF-8 就是其中之一。

EASCII 的意义

对于一些编程语言和文档语言来说,满足 EASCII 的定义是非常重要的。一方面,EASCII 相比于 ASCII 新增了 128 个字符,满足了很多人类语言符号的需求;另一方面,计算机的解释器可以继续基于 ASCII 标准来解释关键的内容(只要确保新增的字符不用于关键内容)。

还有些人错误地把没有满足 EASCII 定义的那些 8-bit 编码方式统统称为 ASCII 扩展版,这样的表述是不严谨的哦~


5. 结语

本文主要讲了:

  1. 字符编码的鼻祖(摩尔斯电码)有 5 个元素;
  2. 字符编码的常见术语:码元,码位...;
  3. US-ASCII 编码是 7-bit;
  4. EASCII 不是一个统一的编码标准,只是 ASCII 编码的 8-bit 扩展版;
  5. 多字节字符编码是可变长度编码的一种最常见形式,满足 EASCII 定义的多字节字符编码也是真正的 EASCII;

最后来个思考题:为什么我们需要 Base64 编码?

References

[1]

Base64 Encoding: https://blog.lunawen.com/posts/20201117-luna-tech-base64-encoding/

[2]

Morse Code: https://en.wikipedia.org/wiki/Morse_code

[3]

摩尔斯电码: https://zh.wikipedia.org/wiki/%E6%91%A9%E5%B0%94%E6%96%AF%E7%94%B5%E7%A0%81

[4]

如何用摩尔斯电码发韩语: https://zhuanlan.zhihu.com/p/106622260

[5]

中文电码: https://zh.wikipedia.org/wiki/%E4%B8%AD%E6%96%87%E7%94%B5%E7%A0%81

[6]

Character Encoding: https://en.wikipedia.org/wiki/Character_encoding

[7]

HTTP: https://en.wikipedia.org/wiki/HTTP

[8]

MIME: https://en.wikipedia.org/wiki/MIME

[9]

EBCDIC: https://en.wikipedia.org/wiki/EBCDIC

[10]

GB 18030: https://zh.wikipedia.org/wiki/GB_18030

[11]

ASCII: https://en.wikipedia.org/wiki/ASCII

[12]

Octet: https://zh.wikipedia.org/wiki/%E5%85%AB%E4%BD%8D%E5%85%83%E7%B5%84

[13]

EASCII: https://en.wikipedia.org/wiki/Extended_ASCII

[14]

ISO/IEC 8859-1: https://zh.wikipedia.org/wiki/ISO/IEC_8859-1

[15]

Windows-1252: https://en.wikipedia.org/wiki/Windows-1252

[16]

ANSI: https://en.wikipedia.org/wiki/American_National_Standards_Institute




推荐阅读
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
author-avatar
赵美晓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有