与以二进制存储等效消息相比,存储纯文本数据是否占用更少的空间?


32

作为一名Web开发人员,我对二进制数据了解甚少。

如果我使用句子“ Hello world。”,将其转换为二进制文件,然后将其作为二进制文件存储在SQL数据库中,似乎 1和0会比字母占用更多的空间。在我看来,使用字母有点像使用压缩,其中一个符号代表多个。

但这真的是这样吗?

与以二进制存储等效消息相比,存储纯文本数据是否占用更少的空间?


126
您不知道每个开发人员必须了解的字符编码的绝对最低要求。幸运的是,该网站的创建者为您写了一篇文章。在再次编程之前,请先阅读它。joelonsoftware.com/2003/10/08/...
埃里克利珀

16
@EricLippert很棒的读物,因此,我过得更好,谢谢。
约翰·多伊


2
成为网络开发人员不是不知道字符编码和二进制数据如何工作的借口。您确实需要提高自己的技能...
T. Sar-恢复莫妮卡的时间

Answers:


134

纯文本是二进制的。

当您H向硬盘驱动器中写入数据时,写入头不会在盘片中刻出两条垂直线和一条水平线,而是将位010010001磁性编码到盘片中。

从那里开始,显而易见的是,存储纯文本数据所占用的空间与存储二进制数据所占用的空间完全相同。

但是纯文本只是2特定的二进制格式

纯文本可以可逆地转换为其他二进制格式。一种常见的转换是压缩,通常会导致更紧凑的表示,这意味着更少的位用于表示相同的信息。

根据您使用纯文本表示的内容,您也许可以使用不同的二进制格式来表示相同的信息。这可能会使用更多的空间,可能会使用更少的空间。

例如,数字51234567可以使用数字字符以纯文本形式表示,从而在磁盘3上产生这些位序列:

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

另外,您可以使用32位二进制补码

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

这是的紧凑表示5,但是的紧凑表示1234567

尽管实际上实际上远远少于实际使用的许多表示形式,但是实际上还有无数其他表示形式会具有不同程度的紧凑性和灵活性。


1个假设为UTF-8。字符的确切位顺序取决于您使用的是哪种特定编码。

2或确实有几种格式,编码

3如果您想知道两端的那八个零,那么,您需要某种方式来知道数据的长度。选项基本上可以归结为一个标记(我通过一个空字节使用此标记),专用于存储长度的空间(Pascal使用一个字节存储字符串的长度)或固定大小(用于随后的两个补码)例)。


6
行尾表示略有不同,它在Unix /二进制中占1个字节(LF),而在Windows /文本中占2个字节(CR-LF)。
Glenn Randers-Pehrson '17

97
1对“上的写头不刻两条垂直线和一条水平线到盘片
Tulains科尔多瓦

@BaardKopperud你是对的!;)
图兰斯·科尔多瓦

2
@BaardKopperud有/曾经有LightScribe,但这并不是真正意义上的计算机阅读,尽管诸如Google Goggles之类的东西可以阅读一些LightScribe标签。但是,在实际的数据存储方面执行此操作将非常有趣。让我想起通过示波器运行时具有精美图形的歌曲。
8bittree

2
@TulainsCórdova尽管实际上,图灵机可以在任意字母上运行,所以理论上它们可以在磁带上写字母。碰巧的是,我们决定使用两个符号的字母。
戈登黑德'17

15

我觉得这很有趣。二进制不是您所说的1和0。

想象有一个数量,我可以通过许多不同的方式告诉您这个数量:

  • Nine 用英语
  • Neuf 用法语
  • 9 用阿拉伯数字
  • IX 罗马数字
  • 1001 用阿拉伯数字二进制
  • on off off on 在二进制中打开/关闭
  • high low low high 用电压或杠杆或水位或电荷表示的二进制文件...或英文单词“ high”和“ low”

它们都代表同一件事。这里的要点是二进制不是1和0,这只是表示值的一种方式。

当谈到将H转换为二进制时,您可能会想象在屏幕上看到10101010-但这不是“二进制”,每个二进制位都是一位。

是的,如果您H像人们通常所说的那样转换为“二进制”,然后用阿拉伯数字表示然后存储它,那么它将花费更多的空间,就像转换Haitch需要更多空间一样。

但是您可以看到二进制是表示数量的一种方式,逻辑上说:“如果我将H转换为二进制并将其表示为3,high low high low high low high low那么它将需要35个字符!这甚至比10101010!但是这两个都是'binary' ..那么一个比另一个大吗?

这样做的另一边是想知道如何H由计算机存储,并且一看就知道H是本身只是一个代表数量的办法-同样的数量7201001000或者seventy two或ASCII字符代码H。8bittree的回答是纯文本二进制的,但这是我试图证明的意思

因此,您在计算机中出现了一些模式,01001000这是什么意思?任何东西-可以被当作数字来谈论,作为zip文件的一部分,作为字符,取决于创建它的人的意图。如果您知道它应该是纯文本,则它来自字符编码H-> ,然后01001000在字符编码表中以其他方式查找它-ASCII,UTF-8,shift-jis等,然后找到正确的字体角色出来一个H或任何东西。否则,如果您使用与创建它的人不同的编码查找,那么就会出现错误的字符。这是@Eric Lippert的链接。

但是当我写这篇文章时,正如您所想的那样,它H是一个字节且01001000是8个字节,是的,这是更多的空间。是的,它是(二进制)表示。但这比计算机使用的抽象级别更高-二进制以ASCII字符显示,其中每个字符在后台用二进制位模式表示,每个位都与H单独的一样大。


12

与以二进制存储等效消息相比,存储纯文本数据是否占用更少的空间?

没有永不。

您的计算机已经以等效的二进制表示形式存储了纯文本数据。将某些内容存储为纯文本格式还是二进制格式,仅表示计算机应如何解释相同的二进制流。

在我看来,使用字母有点像使用压缩,其中一个符号代表多个。

确实是这样。一个字符代表多个位。问题在于它们是大小不同的东西。存储1或0只需要一位,而存储纯文本字符只需8位(或更多)。使用字符不会获得任何收益。

如果有的话,您可以用其他方式压缩内容。毕竟8位是256个不同的可能值,而纯文本通常限于字母,数字和一些标点符号。它不需要尽可能多的位。


3
好吧,也许有时候:-)我能想到两种可能的情况。1)您有一个压缩的短文本字符串。压缩文件包含一些元数据,这使压缩文件大于原始字符串。2)您有一些浮点值,例如1.2。作为文本存储将为3个字节(带终止符的为4个字节),而存储二进制double则为8个字节。
jamesqf

5
答案确实取决于您所说的“二进制”。例如,UTF-32占据了四倍空间ASCII,所以如果通过“纯文本”你的意思是ASCII,并通过“二进制”你的意思是UTF-32,纯文本采取比二进制更小的空间。但是您可以颠倒定义并获得相反的结果。
大卫·康拉德

1
@DavidConrad好吧,这只是“没有纯文本这样的东西”。您拥有的最接近的文件是一个二进制文件,其中没有元数据/标头来标识类型并猜测“必须是文本编码为XXX!”。曾经有一段时间,“纯文本文件”在有限的上下文中表示合理的意思,但实际上已经不复存在了。与“文件中的某些/所有部分未编码为文本”相反,最好的选择是“文件中的所有数据均编码为文本”。
Lu安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.