热门标签 | 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




推荐阅读
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
  • Non-ASCIIhelponitsownisOK: ... [详细]
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社区 版权所有