将八进制的字符串转化为中文字符串(笨方法)

在爬取抖音的时候,由于抖音序列化使用的是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

 

 

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

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

 

posted @ 2019-11-25 22:29  roadcode  阅读(8772)  评论(0编辑  收藏  举报