为什么zmq.setsockopt_string对默认的'ansi'编码抱怨?

5 投票
2 回答
5892 浏览
提问于 2025-04-18 16:19

我正在试着搞清楚我的开发环境是不是出了什么问题,因为“在我同事的电脑上可以运行”,但在我的电脑上却不行。在没有直接解决主要问题之前,我先关注了我发现的第一个奇怪的地方。

我有一段代码,让我困惑的是,为什么一个调用可以正常工作,而另一个却不行:

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")

我假设在正常工作的调用中,我传递的是一个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

因为订阅是由另一方创建的,所以它可以是Unicode格式。在将它们转换为ASCII格式时,你可以选择让接收方也使用订阅的Unicode名称。

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

遇到的问题是因为在setsockopt_string方法中使用了unicode/str类型的值。一个快速的解决办法是:

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

这样做会传递字节而不是字符串。如果你有一个变量的话,可以这样写:

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

这样在Python 2和Python 3中都能正常工作。

撰写回答