【发布时间】:2019-03-31 05:04:51
【问题描述】:
我想用哈希替换子字符串 - 所述子字符串包含非 ascii 字符,因此我尝试将其编码为 UTF-8。
result = re.sub(r'(Start:\s*)([^:]+)(:\s*)([^:]+)', lambda m: m.group(1) + m.group(2) + m.group(3) + hashlib.sha512(m.group(4).encode()).hexdigest(), line.encode('utf-8'))
我不确定为什么这不起作用,我认为使用 line.encode('utf-8'),整个字符串都会被编码。 我还尝试将我的 m.groups 编码为 UTF-8,但我得到了相同的 UnicodeDecodeError。
[unicodedecodeerror: 'ascii' 编解码器无法在位置解码字节 序数不在范围内(128)]
示例输入:
Start: myUsername: myÜsername:
我错过了什么?
EDIT_
Traceback (most recent call last):
File "C:/Users/Peter/Desktop/coding/filter.py", line 26, in <module>
encodeline = line.encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 112: ordinal not in range(128)
【问题讨论】:
-
能否请您发布示例输入和您提到的错误的堆栈跟踪? (一般来说,你的问题似乎不是MCVE)。
-
你是对的,对不起 - 我提供了更多信息
-
这是 Python 2 还是 Python 3 代码?我强烈怀疑你的问题是你在 Python 2 上运行,并试图
encode和str(这在很大程度上是荒谬的)。完整的回溯和minimal reproducible example 会有所帮助。最后,可以肯定的是,拆分线路,以便每行仅encode一次,例如encodedline = line.encode('utf-8'),然后将re.sub中的line.encode('utf-8')替换为encodedline,这样您就不会混淆哪个encode是问题所在。 -
我正在运行 python 2.7 - 有没有办法解决这个问题或者我应该使用“hack”?
-
@peacemaker: hack 是个坏主意(
setdefaultencoding在调用它之后从sys中删除是有原因的;更改默认的中期运行风险可能会导致各种库中的各种问题已经缓存了编码,或者在其中编码的结果,突然发现事情的行为与启动时不同)。我强烈怀疑您的代码将通过删除该行中对encode的所有调用来工作;您已经拥有 UTF-8 编码数据,因此再次尝试encode是您问题的根源。见my answer。
标签: python unicode utf-8 ascii