V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yezheyu
V2EX  ›  程序员

关于编码的一些疑问?

  •  
  •   yezheyu · 2021-12-21 10:42:40 +08:00 · 1950 次点击
    这是一个创建于 1087 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我新建一个文件,并以二进制形式往里写入大写字母 A 的 ASCII 所对应的 01000001 ,按理说,把文件以文本格式打开,显示的应该是 A ,占用一个字符,但结果显示是 01000001 ,占用 8 个字符

    fd = open('./a.test', 'xb')
    fd.write(b'01000001')
    

    为什么呢?是因为缺少 EOF 之类控制字符吗,在写入进文件时被 IDE 直接优化成文本吗?又或者打开时被文本软件优化了?

    对于一个二进制文件,以文本格式打开,文本软件会把二进制 bit 按照每 8bit 算作一个字符对照 ascii 编码表翻译,而 ascii 最大值是 01111111 ,也就是说如果有 8bit 大于这个数,如 10111111 ,因为找不到参照,文本软件就会显示乱码是吗?乱码字符对应的那个图案是从哪找的呢?

    还有如果二进制文件的大小不是 8bit 整数倍,假如最后剩下 3bit ,文本软件也会显示乱码吗?

    所以有了 base64 ,使用 6bit 全部占满的编码方式重新编码二进制文件,保证不会出现乱码,然后在网页和邮件中传输是吗?但实际没必要,直接在网络中使用原始二进制传输也可以,只是网页和邮件的协议要求而已,对吗?

    第 1 条附言  ·  2021-12-21 11:34:45 +08:00
    多谢大家,那我下面关于乱码的理解对吗?
    9 条回复    2021-12-21 13:20:22 +08:00
    shadowCheng
        1
    shadowCheng  
       2021-12-21 11:04:49 +08:00
    b'01000001'指的只是 byte 类型'01000001'字符串
    debuggerx
        2
    debuggerx  
       2021-12-21 11:06:40 +08:00
    L1 正解,正确的写法应该是:
    fd.write(bytes([0b01000001]))
    qianxings
        3
    qianxings  
       2021-12-21 11:10:47 +08:00
    xylxAdai
        4
    xylxAdai  
       2021-12-21 11:20:51 +08:00
    。。。b 关键字是 byte 。。不是 bit 。
    hsfzxjy
        5
    hsfzxjy  
       2021-12-21 11:49:21 +08:00 via Android
    > 多谢大家,那我下面关于乱码的理解对吗?

    不对,你只能写入 8bit 的整数倍,也就是完整的 byte 。
    sujin190
        6
    sujin190  
       2021-12-21 12:01:54 +08:00
    似乎有点本末倒置了啊,所有文件保存的、网络传输的都是二进制,并没有啥区别,

    为啥有二进制文件和文本文件,这个其实是用你的查看方式决定的,你用文本查看就是文本文件,文本文件有不同编码方式,比如 gbk ,utf8 之类的,你打开文件的时候就已经选定了一种解码方式,并不是文件告诉你应该用啥解码,所以才会有乱码问题,乱码图案自然从你选定的解码方式里找啊

    关于 base64 其实是邮件和网页已经首先选定了文本型 utf-8 编码换行分隔,如果你直接在里边放二进制数据,那么二进制数据自身就会影响解析,比如二进制里按文本解析就有换行符啊,这时就要解析出错了,本质来说在编码的分层结构中,网页和邮件是用的是规则匹配来解析数据,那么首先你网页邮件里保存的数据就必须保证不能有符合网页邮件解析规则的数据,所以才有了 base64 来把二进制数据编码成肯定不会匹配网页解析规则的文本数据,而像 grpc 这种用的就是预定义结构解析,所以内部保存的数据不可能影响结构解析过程,所以也就不需要再编码
    yezheyu
        7
    yezheyu  
    OP
       2021-12-21 12:40:01 +08:00
    @hsfzxjy 也就是说只有 utf8 ,gbk 之类多字节编码才会出现字节不足的问题是吧
    yezheyu
        8
    yezheyu  
    OP
       2021-12-21 13:09:58 +08:00
    @sujin190 首先谢谢老哥!

    也就是说 rpc 和 HTPP 相比,只是自定义的协议,换了中数据占用更小的格式传输,底层还是 tcp 那套。

    关于 rpc 和 http 的区别,能具体说下吗?对于它们,我有点概念模糊
    sujin190
        9
    sujin190  
       2021-12-21 13:20:22 +08:00
    @yezheyu #8 网络看除了传输协议不同外,没啥区别,只是 rpc 一般会定义更完整的调用流程,http 本身只定义了传输过程,http 服务端和客户端都各有各的实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1742 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:21 · PVG 00:21 · LAX 08:21 · JFK 11:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.