为什么zmq.setsockopt_string会抱怨默认' ascii'码?

时间:2014-08-07 00:05:20

标签: python encoding zeromq pyzmq

我正在试图弄清楚我的开发环境是否以某种方式搞砸了,因为“它适用于[我的同事]计算机”,但不是我的。我正在研究我发现的第一个有趣的事情,而不是解决问题的“肉”。

我有一些代码没有意义,为什么一个调用可以工作,另一个没有:

import sys
import zmq

if __name__ == "__main__":
    print sys.getdefaultencoding()  # Displays 'ascii'

    zContext = zmq.Context()
    zSocket = zContext.socket(zmq.SUB)

    # This works.
    zSocket.setsockopt_string( zmq.SUBSCRIBE, "Hello".decode('ascii'))

    # This fails with error... why?
    # raise TypeError("unicode strings only")
    #
    # Shouldn't the default encoding for "Hello" be ascii?
    # zSocket.setsockopt_string( zmq.SUBSCRIBE, "Hello")

    zSocket.connect( "tcp://localhost:5000")

我假设对setsockopt_string的工作调用,我传递的是ascii字符数组。在破碎的代码中,我必须发送不是ascii而不是unicode的东西。我怎么知道什么传递给setsockopt_string?

也许这甚至不是要问的问题。我只是很困惑。

任何帮助都会很棒。

这是我的环境:

python --version
Python 2.7.3
#1 SMP Debian 3.2.57-3+deb7u2 x86_64 GNU/Linux

感谢。

2 个答案:

答案 0 :(得分:4)

设置为setsockopt_string方法的unicode / str值导致遇到的问题,快速解决方法是:

zSocket.setsockopt_string(zmq.SUBSCRIBE, b"Hello")

这会传递字节而不是字符串,或者如果你有变量,那么你应该这样写:

zSocket.setsockopt_string(
    zmq.SUBSCRIBE,
    bytes("Hello", encoding="latin-1")
)

这适用于python 2和3

答案 1 :(得分:0)

由于订阅是由另一方创建的,因此可以是Unicode。在使它们成为ascii的一种选择的同时,您也可以采用接收者的订阅的统一名称。

socket.setsockopt_string(zmq.SUBSCRIBE, topicfilter, encoding='utf-8')