【问题标题】:python array.tostring() has NUL bytes in itpython array.to string() 中有 NULL 字节
【发布时间】:2012-01-12 17:05:49
【问题描述】:

我在单元测试TestCase中有以下代码(作为示例)

def test(self):
    a = array('u','\0'*3)
    a[0] = 'h'
    a[1] = 'h'
    a[2] = 'h'

    self.assertEqual(a.tostring(), "hhh")

断言失败并出现以下错误:

AssertionError: b'h\x00\x00\x00h\x00\x00\x00h\x00\x00\x00' != 'hhh'

现在我知道我创建的数组是 4 个字节长的 Unicode 字符,因此我输入的每个字符都有额外的 3 个 NUL 字节。我的问题是:

  1. 我可以将字符串“hhh”转换为我的断言内联的 Unicode 表示吗?
  2. 是否有用于创建我的数组的 ascii 选项?

编辑:回答出现的问题: 1. 我正在使用 Python 3 2. 数组来自模块数组,可以通过:from array import array 导入

【问题讨论】:

  • 什么是数组? (从哪里导入?或者定义是什么?)
  • 我问是因为它甚至没有运行... >>> array.array('u','\0'*3) 返回一个 Traceback。
  • 嗨,对不起,您需要从数组导入数组中的行
  • 奇怪,仍然没有像上面写的那样为我运行。 ValueError:字符串长度不是项目大小的倍数。 2.7.2 在这里。
  • 啊,在 Python3 中工作就是问题所在。

标签: python arrays unicode python-3.x


【解决方案1】:

我想您正在使用 Python3,它似乎缺少 array'c' 选项。

在这种情况下,我会这样做

a = array.array("b",4*(0,))
a[0] = 'h'
a[1] = 'h'
a[2] = 'h'

另一种选择是

a=array.array('u', "hhh") # the same as yours, but shorter
a.tounicode()

但是你有一个 unicode 字符串而不是 bytes() 对象。

【讨论】:

    【解决方案2】:

    您所做的是明确请求数组的bytes 表示。这自然不等于 unicode 表示。

    来自文档:

    array.tostring():不推荐使用 tobytes() 的别名。

    array.tobytes():将数组转换为机器值数组 并返回字节表示(相同的字节序列 将通过 tofile() 方法写入文件。)

    3.2 版中的新功能:为清楚起见,tostring() 被重命名为 tobytes()。

    您需要改用tounicode

    >>> import array
    >>> s = "a\xbb\ucccc\U0001dddd"
    >>> array.array('u', s).tounicode() == s
    True
    

    如果您从 Python 2.x 迁移一些代码,您会发现这与您在此处看到的内容自然等价;上述 sn-p 的 Python 2.x 版本的唯一区别是 s = u"etc etc"

    类型'u'是数组模块的一个黑暗角落,它本身就是Python的一个黑暗角落。如果您不是从 Python 2.x 迁移,您可能想说出您想要实现的目标(可变字符串?),并获得一些指导。

    【讨论】:

    • 可变字符串确实,我正在实现一个间隙缓冲区。任何建议将不胜感激
    • 也许匿名的路过投票者可能想留下解释或更正?
    • tostring() 几乎没有“明确”请求字节对象。期望一个名为“tostring”的方法返回一个字符串似乎并不是完全不合理的。 IMO 将其别名为 tobytes 而不是 tounicode 的决定违反了最小意外原则。但是,嘿,我不是 BDFL。
    猜你喜欢
    • 2012-01-02
    • 2020-09-21
    • 2020-09-18
    • 2021-12-17
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多