文本转二进制:一个字符串在字节层面长什么样
这个换算在做什么
它先用 UTF-8 把文本编码成字节,再把每个字节写成八位二进制。这里没有算术——字符只是查表写出——但结果就是这段字符串真正会被存储或传输的那一串 1 和 0。
为什么是 UTF-8 而不是纯 ASCII
ASCII 只定义了 128 个字符,够英文用,其他文字一概没有。UTF-8 把前 128 个编码保持不变,其余字符摊到两、三或四个字节上,所以英文串产生的字节和 ASCII 完全一样,而中文和 emoji 也能正常工作。这就是为什么字母 A 只占一个字节,而一个汉字要占三个。
文本转二进制对照表
短字符串及其二进制字节序列。多字节的那几行最有意思:它们展示了一个字符如何变成一组字节,每个字节都带着可以辨认的前导位模式。
| 文本 | 二进制 |
|---|---|
| A | 01000001 |
| Hi | 01001000 01101001 |
| OK | 01001111 01001011 |
| 123 | 00110001 00110010 00110011 |
| ! | 00100001 |
| Go | 01000111 01101111 |
那个你没料到的字节
文本处理中最常见的意外,是字符串比看上去更长。五个字符可能是五个字节也可能是十五个字节,取决于所用文字,任何以字符计的限长都会被以字节计的限长打破。看到字节序列就具体了:多字节字符里每个字节的前导位都在宣告这个字符一共占几个字节。
字节数和字符数是两回事
当数据库字段、接口限制或协议头以字节计时,请数字节而不是数字符。转换器直接显示字节序列,所以有几组就是几个字节,而那正是这些限制实际检查的那个数字。
常见问题
文本是怎么变成二进制的?
每个字符先在 UTF-8 编码表里查出对应的字节值,再把这个字节写成八位二进制。字母 A 是字节 65,也就是 01000001;因为它落在最初的 ASCII 范围内,所以只占一个字节。
为什么一个汉字不止一个字节?
因为 UTF-8 要覆盖远超 256 个字符,前 128 个之外的字符就得摊到两、三或四个字节上。一个汉字通常占三个字节,所以在这里显示为三组八位数字而不是一组。
这和 ASCII 是一回事吗?
对纯英文文本来说是的——UTF-8 的设计保证了前 128 个编码与 ASCII 逐字节相同,所以 Hello 在两种编码下完全一样。一旦用上带音标的字母、货币符号或任何非拉丁文字,两者就分道扬镳了,那时 ASCII 无能为力,而 UTF-8 依然可用。
为什么字节之间要用空格隔开?
因为连续不断的二进制没法读,还容易数错,而以空格分隔的八位一组能直接显示字节边界。解码时输入里的空格会被忽略,所以从这里复制出去的序列可以原样粘回反向工具,不必再编辑。
emoji 也能处理吗?
可以。emoji 落在三个字节能到达的范围之上,所以 UTF-8 里多数 emoji 用四个字节编码,在这里就显示为四组八位数字。一个 emoji 编码之后,可能比一个很短的英文单词还长。