zoukankan      html  css  js  c++  java
  • 将八进制的字符串转化为中文字符串(笨方法)

    在爬取抖音的时候,由于抖音序列化使用的是protobuf,反序列化后,中文显示的是八进制字符串,需要将八进制转化为中文。网上找了好久,没有找到现成的方法,就自己写了一个比较笨的方法。

    一、思路

    源字符串是夹杂着八进制字符串和英文字母的字符串,如:

    "

    ssssssssssssssssfffffffffffffffffffffddddddddddddddddddsssssssssssss\229\156\168\233\169\190sdfsafsasfsddddddddddddd

    "

    以上只是示例,实际上,字符串会很会长。

    而三个八进制字符串代表一个中文字符。所以,我们要先用正则表达式将八进制字符串匹配出来,三个为一组。

    然后将这三个八进制字符串转换为汉字,再将其替换到原文之中。(re.sub())

    二、那么如何将三个八进制字符串转换为数字呢?

    思路是将八进制转换为十进制数字,然后利用bytes将十进制数转换为byte,最后再decode('utf8')即可。

    bytes有一个方法,将一个10进制的列表转换为一个汉字:

    即:

      bytes([232, 174, 176])

    如:

    \229\156\168

    上面是三个八进制字符串

        ls = value.split('\')[1:]  #将8进制字符串分开,放入列表
        ls = [int(i,8) for i in ls]   #将8进制转为10进制
        try:
            return  bytes(ls).decode('utf8')  #将10进制的列表直接转为一个汉字
        except UnicodeDecodeError:   #如果出现编码错误(即不存在该编码),则返回“!错!”
            return '!错!'

    三、代码

    import re
    
    def sub_str(value):
        ls = value.group().split('\')[1:]
        ls = [int(i,8) for i in ls]
        print(ls)
        try:
            return  bytes(ls).decode('utf8')
        except UnicodeDecodeError:
            return '!错!'
    
    text = re.sub(r'(?:\d{3}){3}', sub_str, text) #sub为替换,可以使用函数。
    
    sub的使用:请参见:
    https://blog.csdn.net/qq_27061049/article/details/90708624

     以上即可以将穿插在英文中的八进制字符串转化为中文,并用中文替换该八进制字符串。

    如果大家有简便的方法,烦请告知。

  • 相关阅读:
    一次优化web项目的经历记录(一)
    自己做的萌萌哒的js宠物挂件~
    最近的两个小项目,2:Python webapp的docker镜像
    最近的两个小项目,1:在Vscode里写C/C++
    Markdown写接口文档,自动添加TOC
    使用SqlAlchemy时如何方便的取得dict数据、dumps成Json
    【漏洞预警】SaltStack远程命令执行(CVE-2020-11651、CVE-2020-11652) 植入挖矿木马的应急响应 salt-minions salt-store挖矿程序跑满cpu
    pycharm 常用配置
    gitlab + jenkins + docker + k8s
    Microservice 概念
  • 原文地址:https://www.cnblogs.com/ohahastudy/p/11931278.html
Copyright © 2011-2022 走看看