python版本之间的base64编码不同

Posted

技术标签:

【中文标题】python版本之间的base64编码不同【英文标题】:Different base64 encoding between python versions 【发布时间】:2017-11-27 10:41:08 【问题描述】:

我无法通过 JSON 发送 html 代码。

我注意到我的字符串值在 python 版本(2.7 和 3.5)之间有所不同

我的字符串类似于:<html><p>PAÇOCA</p></html>

关于Python 2.7

x = '<html><p>PAÇOCA</p></html>'
base64.b64encode(x)
=> PGh0bWw+PHA+UEGAT0NBPC9wPjwvaHRtbD4=

关于Python 3.5

x = '<html><p>PAÇOCA</p></html>'
base64.b64encode(x)
=> b'PGh0bWw+PHA+UEHDh09DQTwvcD48L2h0bWw+'

为什么这些值不同? 如何使 3.5 字符串等于 2.7

由于口音丢失,这导致我无法接收电子邮件。

【问题讨论】:

PGh0bWw+PHA+UEGAT0NBPC9wPjwvaHRtbD4= 是 [cp437, cp850, cp852, cp857, cp858, cp860, cp861, cp863 or cp865] + base64 编码的&lt;html&gt;&lt;p&gt;PAÇOCA&lt;/p&gt;&lt;/html&gt; PGh0bWw+PHA+UEHDh09DQTwvcD48L2h0bWw+&lt;html&gt;&lt;p&gt;PAÇOCA&lt;/p&gt;&lt;/html&gt;的UTF-8 + base64编码。 (我无法提供进一步的帮助,因为我不知道 Python 如何处理字符编码。) 【参考方案1】:

您的示例 x 值不是有效的 Python,因此很难判断代码哪里出错,但答案是使用 Unicode 字符串并显式编码以获得一致的答案。下面的代码在 Python 2 和 3 中给出了相同的答案,尽管 Python 3 在打印时使用 b'' 装饰字节字符串。以#coding 声明的编码保存源文件。源代码编码可以是任何支持源文件中使用的字符的编码。通常 UTF-8 用于非 ASCII 源代码,但我故意让它不同以表明它无关紧要。

#coding:cp1252
from __future__ import print_function
import base64
x = u'<html><p>PAÇOCA</p></html>'.encode('utf8')
enc = base64.b64encode(x)
print(enc)

使用 Pylauncher 输出以选择主要 Python 版本:

C:\>py -2 test.py
PGh0bWw+PHA+UEHDh09DQTwvcD48L2h0bWw+

C:\>py -3 test.py
b'PGh0bWw+PHA+UEHDh09DQTwvcD48L2h0bWw+'

【讨论】:

我认为这个答案部分正确。在某些情况下,python2 中使用的 base64 编码可能会保存在数据库中。在这种情况下,我们需要一种方法来获得与 python3 相同的 base64 编码。有什么办法吗? @FareesHussain 他们是一样的。 Python 3 只是显示 字节字符串,b'' 表示它是字节字符串,但两个 Python 版本中的结果都是字节字符串。 我的意思是使用python3获取PGh0bWw+PHA+UEGAT0NBPC9wPjwvaHRtbD4= base64编码值 @FareesHussain .decode() 会将其转换为 Unicode 字符串,该字符串将在 Python 3 上不带字节表示法打印。

以上是关于python版本之间的base64编码不同的主要内容,如果未能解决你的问题,请参考以下文章

Python base64编码

为什么要使用base64编码,有哪些情景需求?

3 Base64编码主要应用在那些场合?

delphi java 有没有能相互base64编码的方法啊

Pdf与Base64编码之间的转换

Python中的Base64编码的加密与解密