字符串编码转换,大佬们救救孩子(第二阶段)
本帖最后由 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: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 请自行分离
hrpzcf 发表于 2021-12-28 14:18
大佬不是这个意思,我用的email.get() 函数获取到的是已经解码完毕的,照着大佬您这么写的话,我还得去修改源码。
能不能只对字符串转换输出? 本帖最后由 hrpzcf 于 2021-12-28 14:26 编辑
z5560636 发表于 2021-12-28 14:22
大佬不是这个意思,我用的email.get() 函数获取到的是已经解码完毕的,照着大佬您这么写的话,我还得去修 ...
email.get()得到什么?str2?
如果一定要走email.get()的话就算走弯路了 hrpzcf 发表于 2021-12-28 14:23
email.get()得到什么?str2?
如果一定要走email.get()的话就算走弯路了
我也不想 用email.get()问题是如此,我应该怎么获取邮件的信息?
本帖最后由 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
{:5_106:} {:5_103:} {:10_279:} {:10_254:} {:10_256:} {:10_254:} {:10_245:} {:10_279:} {:10_279:} {:10_245:} {:10_279:}{:10_279:} {:5_109:} {:5_92:}
页:
[1]