Python 3.6.5中Base58与UTF-8编码兼容问题求助
解决Python3中Base58与UTF-8编码兼容问题
嘿,这个问题我太熟了——Python 2和3的字符串/字节流严格区分,正是导致你代码报错的核心原因!
问题根源
在Python 2里,str和bytes几乎是等价类型,所以你把encode('utf-8')后的字节流和AssetTypeID直接格式化拼接成字符串,再传给base58.b58encode完全没问题。但到了Python 3:
asset['Name'].encode('utf-8')得到的是bytes类型- 用
format拼接时,bytes会被自动转成类似b'xxx'的字符串格式,最终nameString是str类型 - 而
base58.b58encode在Python 3中要求输入必须是bytes类型,传入str就会触发编码异常
修复后的代码
def save_asset(asset): # 将AssetTypeID转为bytes类型(根据实际类型调整,这里假设是字符串或数字) asset_type_bytes = str(asset['AssetTypeID']).encode('utf-8') # 拼接两个bytes对象,用b'_!_'分隔 name_bytes = b'_!_'.join([asset['Name'].encode('utf-8').strip(), asset_type_bytes]) # 对bytes进行base58编码,再解码为字符串,最后拼接文件名后缀 filename = base58.b58encode(name_bytes).decode('utf-8') + '.png'
关键调整点
- 所有参与拼接的内容都统一为bytes类型,避免str和bytes混合操作
- 使用
b'_!_'.join()来拼接字节流,比format更适配bytes场景 - 最后把base58编码后的bytes解码为str,再和
.png拼接成合法的文件名字符串
这样修改后,代码就能在Python 3.6.5中正常运行,逻辑和Python 2版本保持一致。
内容的提问来源于stack exchange,提问作者Menace
相关产品推荐
相关产品推荐

