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

关于编码的一些疑问?

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

    我新建一个文件,并以二进制形式往里写入大写字母 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     Solana     2333 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 15:53 PVG 23:53 LAX 08:53 JFK 11:53
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86