【问题标题】:Fixing Unicode error on checksum creation修复校验和创建时的 Unicode 错误
【发布时间】:2019-09-14 07:22:15
【问题描述】:

我正在尝试调试在为字符串生成 md5 校验和时遇到的以下问题。

我有一个 unicode 文字如下:

>>>>> 129165Warner Bros.MovieESEn la Arena (Gira 30 Años y Un Día / Las Ventas 26 de Junio de 2015)2015SDBUYEn la Arena (Gira 30 Años y Un Día / Las Ventas 26 de Junio de 2015)1065227811https://itunes.apple.com/es/movie/id1065227811Live Not Avail'dOffer missing in availOpenLiveNo avail found-2TrueiTunes47160835 
<type 'unicode'>

但是,当我尝试使用以下内容进行校验和时:

hashlib.md5(string_for_checksum).hexdigest()

我收到以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 47: ordinal not in range(128)

奇怪的是,当我复制并粘贴到字符串中时它工作正常,但是当“在程序内”运行时,它总是给我 unicode 错误。这可能是什么原因造成的?可能是文件编码问题?

【问题讨论】:

    标签: python python-2.7 unicode


    【解决方案1】:

    当您“复制并粘贴字符串”时,它可能不是 unicode 文字,除非您明确地在其前面加上 u

    为了 md5 你需要一些实际的数据字节来散列。 unicode 字符串是一种抽象,表示特定的字符序列,不一定有一个以字节表示的明确数值。

    因此,您需要指定一个显式的字符串编码,如utf8,以将 unicode 字符串转换为 md5 等算法可以有意义地操作的字节序列。

    特别是,在 Python 2(您似乎正在使用)上,Python 解释器会在需要编码时尝试自动将 unicode 字符串转换为某种字节编码。但是,默认情况下,它(通常)尝试编码为 ASCII,因此如果字符串包含纯 ASCII 范围之外的任何字符,您将获得UnicodeEncodeError

    顺便说一句,如果您将非 ASCII 字符粘贴到终端并尝试制作纯字符串文字(没有u,它通常会起作用,因为在这种情况下,Python 将再次自动对您的字符串进行字节编码,但使用编码由您所在的地区和其他环境来源决定。

    一般来说,只需将字符串转换为某种特定的编码,例如mystring.encode('utf8')。只需在调用encode() 之前首先确保它是一个实际的unicode 类型字符串,而不是包含任意编码字符的字节str,否则您可以根据具体情况获得UnicodeDecodeErrors 或mojibake

    【讨论】:

      【解决方案2】:

      你需要先把它编码成一个字节对象:

      hashlib.md5(string_for_checksum.encode('utf-8')).hexdigest()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 2015-03-30
        • 1970-01-01
        • 2011-11-09
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多