Python 3 - 如果字符串仅包含 ASCII,它是否等于字节字符串?

2024-01-17

考虑 Python 3 SMTPD - 接收到的数据包含在字符串中。http://docs.python.org/3.4/library/smtpd.html http://docs.python.org/3.4/library/smtpd.htmlquote:“数据是包含电子邮件内容的字符串”

事实(正确吗?):

  • Python 3 中的字符串是 Unicode。
  • 电子邮件始终为 ASCII。
  • 纯 ASCII 是有效的 Unicode。

因此,传入的电子邮件是纯 ASCII(这是有效的 Unicode),因此 SMTPD DATA 字符串与 SMPTD 接收到的原始字节完全相同。它是否正确?

因此,我的问题是,如果我将 SMTPD DATA 字符串解码为 ASCII,或将 DATA 字符串转换为字节,这是否相当于通过 SMTP 到达的实际电子邮件消息的字节?

上下文(也许是一个更好的问题)是“如何将 Python 3 的 SMTPD 数据准确地保存到文件中接收到的字节?”我担心的是,当 DATA 通过字符串到字节转换时,它会以某种方式从通过 SMTP 到达的原始字节发生变化。

编辑:Python 开发人员似乎认为 SMTPD 无论如何都应该返回二进制数据。好像还没修好...http://bugs.python.org/issue19662 http://bugs.python.org/issue19662


如果一个字符串只包含 ASCII,它是否等于该字符串的字节数?

不,它在 Python 3 中是不相等的:

>>> '1' == b'1'
False

bytes对象不等于str(Unicode string) 对象,与整数不等于字符串的方式类似:

>>> '1' == 1
False

在某些编程语言中,上述比较是正确的,例如在 Python 2 中:

>>> b'1' == u'1'
True

and 1 == '1'在 Perl 中:

$ perl -e "print qq(True\n) if 1 == q(1)"
True

你的问题很好地说明了为什么stricterPython 3 的行为更可取。它迫使程序员面对他们的文本/字节误解,而不必等待他们的代码因某些输入而中断。


  • Python 3 中的字符串是 Unicode。

yes. 字符串是 Unicode 代码点的不可变序列 http://docs.python.org/3/library/stdtypes.html#textseq在Python 3中。

  • 电子邮件始终为 ASCII。

大多数电子邮件作为 7 位消息传输(ASCII 范围:十六进制00-7F)。尽管“几乎所有现代电子邮件服务器都是 8 位干净的。” http://en.wikipedia.org/wiki/8-bit_clean即,8 位内容不会被损坏。和8BITMIME 扩展 https://www.rfc-editor.org/rfc/rfc6152制裁某些 8 位内容的传递。

换句话说:电子邮件是not始终为 ASCII.

  • 纯 ASCII 是有效的 Unicode。

ASCII 是一种字符编码。你可以decode some使用 US-ASCII 字符编码将字节序列转换为 Unicode。 Unicode 字符串没有关联的字符编码,即,您可以encode使用可以表示相应 Unicode 代码点的任何字符编码将它们转换为字节。

因此,传入的电子邮件是纯 ASCII(这是有效的 Unicode),因此 SMTPD DATA 字符串与 SMPTD 接收到的原始字节完全相同。它是否正确?

如果输入在 ascii 范围内,则data.decode('ascii', 'strict').encode('ascii') == data。 尽管库/smtpd.py http://hg.python.org/cpython/file/3.3/Lib/smtpd.py#l329对输入数据进行一些转换(根据RFC 5321)因此您得到的内容为data即使输入是纯 ASCII,也可能会有所不同。


“如何将 Python 3 的 SMTPD 数据准确地保存到文件中接收到的字节?”

我的目标不是找到格式错误的电子邮件,而是将入站电子邮件以它们到达的二进制/字节形式精确保存到磁盘。

您链接的错误(smtpd.py 不应解码 utf-8 http://bugs.python.org/issue19662) 使 smptd.py 非 8 位干净。

你可以覆盖SMTPChannel.collect_incoming_data方法来自smtpd.py http://hg.python.org/cpython/file/3.3/Lib/smtpd.py#l278按原样保存传入字节。


“ASCII 文本字符串也是有效的 UTF-8 文本。” http://docs.python.org/3.3/howto/unicode.html#encodings

是真的。这是 UTF-8 编码的一个很好的特性。如果您可以使用 US-ASCII 字符编码将字节序列解码为 Unicode,那么您也可以使用 UTF-8 字符编码将字节解码(并且在两种情况下生成的 Unicode 代码点相同)。

smptd.py应该使用过latin1(它解码任何字节序列)或ascii(使用“严格”错误处理程序在任何非 ASCII 字节上失败)而不是utf-8(它允许一些非 ASCII 字节——不好)。

记住:

  • 某些电子邮件的字节可能超出 ASCII 范围
  • 根据 RFC 5321 的去透明性不会按原样保留输入字节,即使它们都在 ascii 范围内
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 - 如果字符串仅包含 ASCII,它是否等于字节字符串? 的相关文章

  • 如何在 Mac 上运行 virtualenv python

    我正在尝试使用 virtualenv 在我的 mac 上创建虚拟 python 环境 我已经下载了 virtualenv 但是我无法运行它 因为即使我提供了正确的路径 它也找不到我的 python3 安装路径 这是我运行的命令和响应 vir
  • 为什么不能在 f 字符串中使用“await”?

    为什么不能在 f 字符串中使用 await 有什么方法可以强制 f 字符串在协程函数的上下文中评估格式表达式吗 python3 Python 3 6 0 default Mar 4 2017 12 32 37 GCC 4 2 1 Compa
  • 向 Python 函数添加属性的最佳方法

    以计算数学函数的 Python 函数为例 def func x a b c Return the value of the quadratic function ax 2 bx c return a x 2 b x c 假设我想以函数属性的
  • 即使我使用 SetWindowTextW(),Unicode 文本在编辑框中显示为问号

    我遇到了 unicode 文件名在编辑框中显示为问号的问题 当我将 unicode 字符 例如阿拉伯语或泰语 粘贴到编辑框中时 它们会正确显示 但在运行此代码后 它们会变成问号 怎么会 WCHAR buf 100 GetWindowText
  • 组内条件计数

    我想在之后进行条件计数groupby 例如 按列的值分组A 然后计算每组中值出现的频率5出现在列中B 如果我整个过程都这样做DataFrame 只是len df df B 5 所以我希望我能做到df groupby A df B 5 siz
  • 使用 python3 查找表情符号的宽度

    我尝试使用 python 中的模式打印字母 A def printA length height symbol a for i in range length for i in range height for i in range hei
  • 使用unicode在hdf5中存储字符串数据集

    我试图从包含特殊字符的文件中存储变量字符串表达式 例如 and 这是我的代码 import h5py as h5 file h5 File deleteme hdf5 a dt h5 special dtype vlen str dset
  • 布尔 pandas 之间的操作对称性破缺。具有不等索引的系列

    隐式索引匹配pandas用于不同之间的操作DataFrame Series很棒 而且大多数时候 它都有效 但是 我偶然发现了一个无法按预期工作的示例 import pandas as pd 0 21 0 import numpy as np
  • Python3中如何使用StringIO?

    我使用的是 Python 3 2 1 无法导入StringIO模块 我用io StringIO它可以工作 但我不能使用它numpy s genfromtxt 像这样 x 1 3 n 4 5 8 numpy genfromtxt io Str
  • TCHAR 仍然相关吗?

    我是 Windows 编程新手 在读完 Petzold 的书后 我想知道 使用TCHAR类型和 T 函数来声明字符串或者我应该使用wchar t and L 新代码中的字符串 我将仅针对现代 Windows 截至撰写本文时版本 10 和 1
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 有没有办法在每个特定的时间间隔运行 python Flask 函数并在本地服务器上显示输出?

    我正在使用 Flask 工作 python 程序 我想从字典中提取键 该密钥为文本格式 但我想在每个特定的时间间隔后重复上述整个过程 并每次在本地浏览器上显示此输出 我已经使用flask apscheduler尝试过这个 程序只运行一次并显
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • 使用 Python 从 AWS S3 下载文件

    我尝试使用以下代码将文件从 Amazon S3 存储桶下载到本地 但收到错误消息 无法找到凭证 下面给出的是我编写的代码 from boto3 session import Session import boto3 ACCESS KEY A
  • mac安装Tensorflow出错

    我正在尝试使用以下说明在 mac 中安装 Tensorflow https www tensorflow org install https www tensorflow org install 但是当我想导入tensorflow时 我总是
  • 如何在普通 C89 中读取给定字符长度的 UTF-8 字符串?

    我正在用纯 C89 编写一个自定义的跨平台简约 TCP 服务器 但我也会接受 POSIX 特定的答案 服务器使用 UTF 8 字符串 但从不查看它们的内部 它将所有字符串视为不可变的二进制 blob 但现在我需要接受来自客户端的 UTF 8
  • 使用 pyppeteer 与 asyncio 关联来抓取内容

    我用 python 结合编写了一个脚本pyppeteer随着asyncio从其登陆页面抓取不同帖子的链接 并最终通过跟踪通向其内页的 url 来获取每个帖子的标题 我这里解析的内容不是动态的 但是 我利用了pyppeteer and asy
  • 批量电子邮件仅限 80 封电子邮件 (GMAIL)?

    Gmail 在此处列出了其电子邮件限制 https support google com a answer 166852 hl en https support google com a answer 166852 hl en 但是 我收到
  • 哈希 freezeset 与排序元组

    在 Python 中 给定一组可比较的 可散列的元素s 散列是否更好frozenset s or tuple sorted s 这取决于你在做什么 创建一个更快frozenset 比排序tuple but frozenset占用的内存比tu

随机推荐