z5560636 发表于 2021-12-28 12:51:20

字符串编码转换,大佬们救救孩子(第二阶段)

本帖最后由 z5560636 于 2021-12-28 12:56 编辑

现在重新遇到了问题。
直接用get 获取到的数据是被系统层 使用utf8转义过的了

第一阶段,未转意的字符串:
str1 = {"Content-Type": "=?unknown-8bit?q?application/octet-stream=3B?==?unknown-8bit?b?IG5hbWU9IjEyNjO1xNTa1sbGt9DFz6K749fcLnhsc3gi?="}

第二阶段,转义后的字符串:
str2 = "1263\udcb5\udcc4\udcd4\udcda\udcd6\udcc6\udcc6\udcb7\udcd0\udcc5\udccf\udca2\udcbb\udce3\udcd7\udcdc.xlsx"
# 实际上只是对 IG5hbWU9IjEyNjO1xNTa1sbGt9DFz6K749fcLnhsc3gi 进行了编码转换


现在已知的解决方案是:
1. str2\udc 替换成 \x
2. str2 转换成字节型,或者直接输出 str2.decode("gbk") 即可完成编码转换

以下是对应示例:
print(b'1263\xb5\xc4\xd4\xda\xd6\xc6\xc6\xb7\xba\xcd\xd0\xbe\xc6\xac\xbf\xe2\xb4\xe6\xd0\xc5\xcf\xa2\xbb\xe3\xd7\xdc'.decode("gbk"))

大佬们,请问我应该怎么写?请大佬们附上能正确运行的代码,让小弟学习以下。

hrpzcf 发表于 2021-12-28 14:18:31

本帖最后由 hrpzcf 于 2021-12-28 14:22 编辑

import re
import base64

dict1 = {
    "Content-Type": "=?unknown-8bit?q?application/octet-stream=3B?==?unknown-8bit?b?IG5hbWU9IjEyNjO1xNTa1sbGt9DFz6K749fcLnhsc3gi?="
}

# 从 dict1 的"Content-Type"键值中搜索 =?unknown-8bit?q?application/octet-stream=3B?==?unknown-8bit?b? 后面的内容
m_obj = re.search(
    r"=\?unknown-8bit\?q\?application/octet-stream=3B\?==\?unknown-8bit\?b\?(.+)",
    dict1["Content-Type"],
)

# 以下if m_obj表示如果匹配到内容
if m_obj:
    # m_obj.group(1) 表示匹配到的内容,这里是 IG5hbWU9IjEyNjO1xNTa1sbGt9DFz6K749fcLnhsc3gi?=
    # 使用 base64 解码 IG5hbWU9IjEyNjO1xNTa1sbGt9DFz6K749fcLnhsc3gi?= 这个字符串,得到一个字节码
    b = base64.b64decode(m_obj.group(1))
    # 再使用 gbk 编码解码字节码,得到字符串
    print(b.decode("gbk"))# 结果为 'name="1263的在制品信息汇总.xlsx"',1263的在制品信息汇总.xlsx 请自行分离

z5560636 发表于 2021-12-28 14:22:33

hrpzcf 发表于 2021-12-28 14:18


大佬不是这个意思,我用的email.get() 函数获取到的是已经解码完毕的,照着大佬您这么写的话,我还得去修改源码。
能不能只对字符串转换输出?

hrpzcf 发表于 2021-12-28 14:23:44

本帖最后由 hrpzcf 于 2021-12-28 14:26 编辑

z5560636 发表于 2021-12-28 14:22
大佬不是这个意思,我用的email.get() 函数获取到的是已经解码完毕的,照着大佬您这么写的话,我还得去修 ...

email.get()得到什么?str2?
如果一定要走email.get()的话就算走弯路了

z5560636 发表于 2021-12-28 14:37:41

hrpzcf 发表于 2021-12-28 14:23
email.get()得到什么?str2?
如果一定要走email.get()的话就算走弯路了

我也不想 用email.get()问题是如此,我应该怎么获取邮件的信息?

hrpzcf 发表于 2021-12-28 15:34:09

本帖最后由 hrpzcf 于 2021-12-28 15:38 编辑

z5560636 发表于 2021-12-28 14:22
大佬不是这个意思,我用的email.get() 函数获取到的是已经解码完毕的,照着大佬您这么写的话,我还得去修 ...

def cvtudc(udcstr: str) -> str:
    udc, start = "\\udc", 0
    udcstr = repr(udcstr).strip("'")
    max_i = len(udcstr) - 1
    while True:
      u1 = udcstr.find(udc, start)
      if u1 == -1 or u1 + 1 > max_i or u1 + 4 > max_i:
            break
      start = u1 + 1
      u2 = udcstr.find(udc, start)
      if u2 == -1 or u2 + 4 > max_i or u2 + 6 > max_i:
            break
      b1 = udcstr
      b2 = udcstr
      new = bytes().decode("gbk")
      udcstr = udcstr.replace(udcstr, new, 1)
    return udcstr


# 使用cvtudc函数来把str2转换成可读字符串,理论上像str2的字符串,都可以用cvtudc来转
str2 = "1263\udcb5\udcc4\udcd4\udcda\udcd6\udcc6\udcc6\udcb7\udcd0\udcc5\udccf\udca2\udcbb\udce3\udcd7\udcdc.xlsx"
print(cvtudc(str2))# 结果:1263的在制品信息汇总.xlsx

伽羅~ 发表于 2021-12-28 16:56:12

{:5_106:}

myqf123 发表于 2021-12-28 22:59:26

{:5_103:}

阿萨德按时 发表于 2021-12-29 08:30:53

{:10_279:}

阿萨德按时 发表于 2021-12-29 08:53:19

{:10_254:}

1molHF 发表于 2021-12-29 09:50:34

{:10_256:}

1molHF 发表于 2021-12-29 09:51:57

{:10_254:}

阿萨德按时 发表于 2021-12-29 09:52:02

{:10_245:}

1molHF 发表于 2021-12-29 09:53:00

{:10_279:}

阿萨德按时 发表于 2021-12-29 09:55:09

{:10_279:}

阿萨德按时 发表于 2021-12-29 09:57:34

{:10_245:}

阿萨德按时 发表于 2021-12-29 09:58:26

{:10_279:}{:10_279:}

1molHF 发表于 2021-12-29 10:03:38

{:5_109:}

1molHF 发表于 2021-12-29 10:09:37

{:5_92:}
页: [1]
查看完整版本: 字符串编码转换,大佬们救救孩子(第二阶段)