ascii码与字节
本文最后更新于10 天前,其中的信息可能已经过时,如有错误请发送邮件到184874483@qq.com

SMTP只支持传送七比特的ascii码内容,是不是说这个电子邮件它所传送的量很少?

不是。“SMTP 只支持传送 7 比特 ASCII 码内容”不是说一封邮件只能传很少的数据,也不是说邮件总大小不能超过 7 bit。它说的是:SMTP 早期规定邮件正文在传输时必须是“7 bit clean”的文本数据,也就是每个字符只能使用 7 位 ASCII 字符集中的字符。

换句话说,这里限制的是字符编码范围,不是直接限制邮件总容量。


一、7 比特 ASCII 到底是什么意思?

ASCII 码本身是 7 位编码,可以表示 128 个字符,范围是:

0000000 ~ 1111111
也就是十进制 0 ~ 127

这些字符包括:

英文字母 A-Z、a-z
数字 0-9
常见标点符号
空格
回车换行
一些控制字符

所以 SMTP 早期能直接传的内容,大致就是这种形式:

Hello, this is a test email.
My name is Tom.
123456.

这些都属于 7 位 ASCII 范围内的字符。

但是下面这些内容就不是单纯 7 位 ASCII:

中文:你好
日文:こんにちは
表情:😊
图片、音频、PDF、Word 文件

因为它们不能直接用 7 位 ASCII 表示。


二、这不是说邮件内容很少

这里最容易误解的是:7 bit 不是指整封邮件只有 7 bit,而是指每个传输字符必须属于 7 位 ASCII 字符范围。

例如一封纯英文邮件可以很长:

This is line 1.
This is line 2.
This is line 3.
...

只要每个字符都是 ASCII 字符,它仍然符合 SMTP 原始要求。

所以:

SMTP 只支持 7 比特 ASCII

真正含义是:

SMTP 原始协议传输的是由 7 位 ASCII 字符组成的文本流

不是:

一封邮件只能传 7 bit

这个理解一定要纠正。


三、如果邮件内容很大,会怎么样?

如果邮件内容很大,但全部是 ASCII 文本,比如英文长文,那么从“7 位 ASCII”这个角度看,它仍然可以传。

但是实际邮件系统还会受到其他限制,例如:

邮件服务器允许的最大邮件大小
收件服务器允许的最大邮件大小
单行长度限制
传输过程中的缓存和存储限制
附件大小限制

也就是说,大邮件的问题不是因为“7 bit ASCII”本身,而是因为邮件服务器和传输系统会限制邮件大小。

在计算机网络考研语境里,通常不需要展开具体服务器限制,只要知道:

SMTP 原始协议传输 ASCII 文本;
邮件过大时可能受到服务器最大邮件大小等限制;
但这和“7 bit ASCII”不是同一个限制。

四、如果邮件内容不是 7 位 ASCII,会怎么样?

如果邮件中出现中文、图片、附件等内容,原始 SMTP 不能直接传。

例如中文:

你好

它不是 7 位 ASCII 字符。

图片、PDF、压缩包这些更不是文本字符,它们是二进制数据。

这时就需要用 MIME

MIME 的作用可以理解为:

把非 ASCII 内容或二进制内容,转换成 SMTP 能传输的 ASCII 文本形式。

常见方式有:

Base64 编码
Quoted-Printable 编码

例如附件本来是二进制数据,经过 Base64 编码后,会变成类似这样的 ASCII 字符串:

JVBERi0xLjQKJcfs...

这些字符本身只包含英文字母、数字、加号、斜杠、等号等 ASCII 字符,所以可以通过 SMTP 传输。

接收方收到后,再根据 MIME 说明把这些 ASCII 文本还原成原来的文件。


五、“不足七位 ASCII 文本邮件”这个说法该怎么理解?

如果说的是“某个字符不足 7 位”,这个说法不太准确。

ASCII 字符编码本身按 7 位理解,但实际在计算机中通常以 8 位字节存储和传输,只是最高位不用,或者说最高位为 0。

例如字符 A

ASCII 十进制:65
7 位二进制:1000001
8 位存储形式:01000001

所以并不是每个字符都必须“刚好写满 7 位”。ASCII 编码本身就是一种固定范围的编码,字符值只要在 0 到 127 内,就属于 7 位 ASCII。

如果一封邮件内容是:

A

那当然可以传。它不会因为内容“太少”而出问题。

如果一封邮件只有几个英文字母:

Hi

这也是合法的 ASCII 文本邮件。

因此:

邮件内容少,不会有问题;
邮件字符属于 ASCII 范围,也不会有问题;
SMTP 关心的是字符是否超出 7 位 ASCII 范围,而不是内容有没有“凑够 7 位”。

六、考研中应该怎么记?

在 408 计算机网络里,这个点通常和 SMTP、MIME、电子邮件系统结构一起考。

可以这样记:

SMTP:负责发送邮件,原始协议只能传 7 位 ASCII 文本。
MIME:扩展邮件内容类型,使邮件可以携带中文、图片、音频、视频、附件等非 ASCII 内容。
POP3/IMAP:负责从邮件服务器读取邮件。

更适合做题的表达是:

SMTP 本身只能传送 7 位 ASCII 码文本,不能直接传输二进制文件或非 ASCII 字符。若要传输中文、图片、声音、视频、附件等内容,需要借助 MIME 对内容进行编码和类型说明。

题目里如果问:

SMTP 为什么需要 MIME?

答案就是:

因为 SMTP 原始设计只能传输 7 位 ASCII 文本,而实际邮件常常包含非 ASCII 字符和二进制附件,所以需要 MIME 扩展。

七、一个完整例子

假设发送一封英文邮件:

Subject: Hello

This is a test email.

这基本都是 ASCII 字符,SMTP 可以直接传。

假设发送一封中文邮件:

Subject: 你好

这是一封测试邮件。

中文不能直接用 7 位 ASCII 表示,所以需要 MIME 编码。

假设发送一封带 PDF 附件的邮件:

正文:请查收附件。
附件:report.pdf

PDF 是二进制文件,也不能直接用原始 SMTP 传。邮件系统会用 MIME 把附件编码成 ASCII 文本,再通过 SMTP 发送。


最核心的一句话是:

SMTP 的“只支持 7 位 ASCII”限制的是邮件传输内容的字符表示范围,不是限制邮件总大小;大邮件受服务器大小限制,非 ASCII 或二进制内容需要 MIME 编码后再通过 SMTP 传输。

ascii码与字节的关系

是不是说一个ascii码它有七位bit,汉字或者一些其他字母可能要用两个ascii码来表示,还是说ascii码长度本身不固定

可以这样理解:ASCII 码是一种“字符编码规则”,字节是计算机存储和传输数据时常用的“数据单位”。二者不是同一层面的东西。

最容易出错的地方是把“字符”“编码值”“bit 位数”“字节数”混在一起。

一、ASCII 码和字节不是一个概念

bit 是最小信息单位,只能表示 0 或 1。

byte 是字节,通常:

1 byte = 8 bit

ASCII 码是字符编码表,它规定某个字符对应哪个数字。

例如:

字符 A  → ASCII 十进制 65
字符 a  → ASCII 十进制 97
字符 0  → ASCII 十进制 48

这些数字再用二进制表示。

例如 A 的 ASCII 码是 65:

十进制:65
二进制:1000001

这个二进制刚好需要 7 位,所以说 ASCII 是 7 位编码

但是在计算机里,数据通常按字节存储,所以 A 通常会存成 1 个字节:

A 的 ASCII 码:1000001
实际按 1 字节存储:01000001

前面补了一个 0,变成 8 bit。

所以更准确地说:

标准 ASCII 码本身是 7 位编码;
但在计算机中通常用 1 个字节来存储一个 ASCII 字符。

二、ASCII 码长度本身固定吗?

标准 ASCII 是固定长度编码,可以理解为 7 bit 表示一个字符。

它不是变长编码。

标准 ASCII 能表示 128 个字符:

2⁷ = 128
范围:0 ~ 127

包括英文字母、数字、常见符号、控制字符等。

比如:

A:65
B:66
a:97
0:48
空格:32

这些字符都在 0 到 127 之间。

但是实际存储时,通常一个 ASCII 字符占 1 byte,也就是 8 bit。最高位通常为 0。

所以:

ASCII 编码层面:7 bit
实际字节存储层面:通常 1 byte

这两个说法并不矛盾。


三、汉字是不是用两个 ASCII 码表示?

不是。

汉字不是用两个 ASCII 码表示的。

ASCII 码表里根本没有汉字。ASCII 只能表示英文字符、数字、符号和控制字符,不能表示中文、日文、韩文、emoji 等内容。

汉字要用其他字符编码来表示,例如:

GB2312
GBK
UTF-8
UTF-16
Unicode

这里要区分两个概念:

Unicode:给全世界字符统一编号
UTF-8 / UTF-16 / GBK:把字符编号实际编码成字节序列

例如汉字 ,在不同编码方式下占用的字节数可能不同。

在 UTF-8 中,汉字通常占 3 个字节:

中 → UTF-8 编码:E4 B8 AD

这里是 3 个字节,不是 3 个 ASCII 码。

在 GBK 中,很多汉字占 2 个字节:

中 → GBK 编码通常占 2 个字节

所以不能说“汉字用两个 ASCII 码表示”。更准确的说法是:

汉字不能用标准 ASCII 直接表示;
汉字需要用 GBK、UTF-8 等编码方式表示;
在不同编码中,一个汉字可能占 2 个字节、3 个字节或更多字节。

四、那为什么有时候看起来像“用多个 ASCII 字符表示一个汉字”?

这是另一个层次的问题。

如果一个系统只能传 7 位 ASCII,例如早期 SMTP,那么中文、图片、附件这些非 ASCII 内容不能直接传。此时可以先把原始字节进行编码,比如 Base64 编码。

假设一段中文原本是 UTF-8 字节序列:

你好 → E4 BD A0 E5 A5 BD

这不是 ASCII。

经过 Base64 编码后,可能变成:

5L2g5aW9

这些字符 5L2g5aW9 都是 ASCII 字符。

所以在 SMTP/MIME 里,会出现这种现象:

原始内容:中文或二进制数据
先按 UTF-8 等方式变成字节
再用 Base64 等方式变成 ASCII 字符串
通过 SMTP 传输
接收方再解码还原

但这仍然不是“汉字本身由几个 ASCII 码组成”。它是:

为了适配只能传 ASCII 的通道,把非 ASCII 数据重新编码成 ASCII 字符串。

这点在计算机网络里尤其容易考。


五、一个字符到底占几个字节?

这要看使用的编码方式。

不能直接说“一个字符等于一个字节”。这个说法只在某些编码下成立,比如标准 ASCII。

可以这样理解:

字符只是抽象符号;
编码决定字符如何变成二进制;
不同编码下,同一个字符占用的字节数可能不同。

举几个例子:

字符ASCIIUTF-8GBK
A1 字节1 字节1 字节
01 字节1 字节1 字节
无法表示通常 3 字节通常 2 字节
😊无法表示通常 4 字节通常无法表示

所以:

英文字符 A:
ASCII 可以表示,占 1 字节;
UTF-8 也兼容 ASCII,也占 1 字节。

汉字 中:
ASCII 不能表示;
UTF-8 通常占 3 字节;
GBK 通常占 2 字节。

六、ASCII、Unicode、UTF-8 的关系

这部分容易混。

ASCII 是早期字符编码,只覆盖英文字符、数字和常见符号。

Unicode 是字符集,目标是给全世界所有字符统一编号。比如汉字、日文、韩文、emoji 都可以有自己的 Unicode 编号。

UTF-8 是 Unicode 的一种具体编码方式。它负责把 Unicode 字符编码成字节序列。

UTF-8 的特点是变长编码:

英文字符:1 字节
常见欧洲字符:2 字节左右
常用汉字:3 字节
部分 emoji:4 字节

因此:

ASCII:固定 7 bit,实际通常占 1 byte
UTF-8:变长编码,1 到 4 byte 不等
GBK:中文环境常见,汉字多为 2 byte

七、回到 SMTP 那个问题

SMTP 原始设计只支持 7 位 ASCII,本质上是说:

SMTP 早期希望传输的邮件内容由 ASCII 字符组成。

如果邮件正文是英文:

Hello, this is a mail.

它可以直接传,因为每个字符都能用 ASCII 表示。

如果邮件正文是中文:

你好,这是一封邮件。

它不能直接按原始 SMTP 传,因为中文不是 ASCII 字符。

于是需要 MIME 做转换:

中文内容 → 按 UTF-8 编码成字节 → 再用 Base64 或 Quoted-Printable 编码成 ASCII 文本 → 通过 SMTP 传输

收件方再反向处理:

ASCII 编码串 → Base64 解码 → 得到 UTF-8 字节 → 按 UTF-8 解释成中文

所以 SMTP 中“只支持 7 位 ASCII”的核心含义是:

传输通道原本只认 ASCII 文本;
非 ASCII 内容需要经过额外编码后才能传。

八、考研里怎么记最稳

这几个结论要分清:

1 bit 是 0 或 1。
1 byte 通常等于 8 bit。

标准 ASCII 是 7 位字符编码,能表示 128 个字符。
ASCII 字符在计算机中通常用 1 个字节存储,最高位为 0。

汉字不能用标准 ASCII 直接表示。
汉字需要 GBK、UTF-8、UTF-16 等编码方式表示。

不是“汉字用两个 ASCII 码表示”,而是“汉字在某些编码中可能占多个字节”。

UTF-8 是变长编码,英文通常 1 字节,汉字通常 3 字节。
GBK 中常见汉字通常 2 字节。

SMTP 原始协议只支持 7 位 ASCII 文本,因此中文、附件、图片等要通过 MIME 编码后传输。

一句话总结就是:

ASCII 是字符到数字的编码规则,标准 ASCII 用 7 bit 表示一个字符;字节是存储单位,通常 8 bit。汉字不是由多个 ASCII 码组成,而是通过 UTF-8、GBK 等其他编码表示成多个字节。
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇