相关文章推荐
玩足球的烤土司  ·  Pod 停滞在 ...·  6 月前    · 
留胡子的香菜  ·  修改了 tsconfig.ts ...·  1 年前    · 
乖乖的牛腩  ·  算法竞赛的时候用cin ...·  1 年前    · 

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

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

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