1 回答
TA贡献1853条经验 获得超6个赞
您的 utf-8 被解码为 cp1250。
我在 python3 中所做的是:
orig = "Zażółć gęślą jaźń"
wrong = "Zażółć gęślą jaźń"
for enc in range(437, 1300):
try:
res = orig.encode().decode(f"cp{enc}")
if res == wrong:
print('FOUND', res, enc)
except:
pass
...结果是 1250 代码页。
所以你的解决方案应该是:
import sys
def restore(garbaged):
# python 3
if sys.version_info.major > 2:
return garbaged.encode('cp1250').decode()
# python 2
else:
# is it a string
try:
return garbaged.decode('utf-8').encode('cp1250')
# or is it unicode
except UnicodeEncodeError:
return garbaged.encode('cp1250')
编辑:
"高生旺"无法恢复的原因é«ç”źć—ş:
"高生旺".encode('utf-8')是b'\xe9\xab\x98\xe7\x94\x9f\xe6\x97\xba'。
问题是\x98部分。在 cp1250 中,该值没有字符集。如果你试试这个:
"高生旺".encode('utf-8').decode('cp1250')
你会得到这个错误:UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 2: character maps to <undefined>
获取方式"é«ç”źć—ş"为:
"高生旺".encode('utf-8').decode('cp1250', 'ignore')
但是这ignore部分很关键,它会导致数据丢失:
'é«ç”źć—ş'.encode('cp1250')是b'\xe9\xab\xe7\x94\x9f\xe6\x97\xba'。
如果你比较这两个:
b'\xe9\xab\xe7\x94\x9f\xe6\x97\xba'
b'\xe9\xab\x98\xe7\x94\x9f\xe6\x97\xba'
您会看到该\x98字符丢失,因此当您尝试恢复原始内容时,您会得到一个UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 0-1: invalid continuation byte.
如果你试试这个:
'é«ç”źć—ş'.encode('cp1250').decode('utf-8', 'backslashreplace')
结果将是'\\xe9\\xab生旺'。\xe9\xab\x98可以解码为高,从\xe9\xab它是不可能的。
添加回答
举报