鱼C论坛

 找回密码
 立即注册
查看: 1419|回复: 18

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

[复制链接]
发表于 2021-12-28 12:51:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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"))

大佬们,请问我应该怎么写?  请大佬们附上能正确运行的代码,让小弟学习以下。
最佳答案
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[u1 + 4 : u2]
        b2 = udcstr[u2 + 4 : u2 + 6]
        new = bytes([int(b1, 16), int(b2, 16)]).decode("gbk")
        udcstr = udcstr.replace(udcstr[u1 : u2 + 6], 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-28 14:18:31 | 显示全部楼层

回帖奖励 +2 鱼币

本帖最后由 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 请自行分离
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-28 14:22:33 | 显示全部楼层

大佬不是这个意思,我用的email.get() 函数获取到的是已经解码完毕的,照着大佬您这么写的话,我还得去修改源码。
能不能只对字符串转换输出?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-28 14:23:44 | 显示全部楼层

回帖奖励 +2 鱼币

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


email.get()得到什么?str2?
如果一定要走email.get()的话就算走弯路了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-28 14:37:41 | 显示全部楼层
hrpzcf 发表于 2021-12-28 14:23
email.get()得到什么?str2?
如果一定要走email.get()的话就算走弯路了

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-28 15:34:09 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +2 鱼币

本帖最后由 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[u1 + 4 : u2]
        b2 = udcstr[u2 + 4 : u2 + 6]
        new = bytes([int(b1, 16), int(b2, 16)]).decode("gbk")
        udcstr = udcstr.replace(udcstr[u1 : u2 + 6], 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-28 16:56:12 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-28 22:59:26 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 08:30:53 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 08:53:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 09:50:34 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 09:51:57 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 09:52:02 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 09:53:00 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 09:55:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 09:57:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 09:58:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 10:03:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-29 10:09:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 12:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表