我目前正在开发一个应用程序,它需要连接一个MQ队列,以便让队列在另一个服务中保存消息信息。完成后,服务通过MQ队列返回结果消息并返回给我。在
我发送的是一个字符串消息,其中包含一个类似于以下消息的XML消息:
<?xml version="1.0" encoding="UTF-8"?>
<peticionDemanda>
<subtipo>DEMANDA CONTRATACIÓN</subtipo>
</peticionDemanda>
MQ似乎没有正确解码“Ó”字符,“subtop”字段被保存为“DEMANDA contraci├N”。在
我正在用“UTF-8”编码消息,并且我被告知我用于发送消息的CCSID是850而不是1208(属于UTF-8的CCSID)。
为了运行MQ管理器,我在客户机模式下使用“pymqi”Python库。这是用于向队列发送消息并获取响应的MQManager类:
^{pr2}$我想知道如何定义MQ管理器的CCSID值,希望能够解决代码页不匹配的问题。在
谢谢你!在
在代码中,您可以为以下代码行中发送的消息创建默认消息描述符:
默认情况下,pymqi(与底层ibmqc库类似)将消息描述符
CodedCharSetId
设置为值CMQC.MQCCSI_Q_MGR
。在这可以在source中看到:
^{pr2}$IBM MQ v9.0 KC页面Reference > Developing applications reference > MQI applications reference > Data types used in the MQI > MQMD - Message descriptor > Fields for MQMD > CodedCharSetId (MQLONG)描述了客户机如何处理此问题:
IBM MQ疑难解答文档What CCSID is used by default for WebSphere MQ client messages以稍微不同的方式解释了这一点:
基于850CCSID,我猜您运行的是一个不在美国的Windows操作系统(通常使用ccsid437)。在
有几个选项可以覆盖此选项:
您可以按如下方式以编程方式重写pymqi MQMD默认值:
将env变量
MQCCSID
设置为所需的值(在本例中为1208)。必须在连接到mq之前设置此选项。这在IBMMQV9.0KC页面Developing applications > Developing MQI applications with IBM MQ > Writing client procedural applications > Using the MQI in a client application > Choosing client or server CCSID中有记录。在以下示例适用于Windows:
在
mqclient.ini
中,可以在CHANNELS
节下设置CCSID=number
。这在IBMMQV9.0KC页面Configuring > Configuring connections between the server and client > Configuring a client using a configuration file > CHANNELS stanza of the client configuration file中有记录。例如:您不需要更改队列管理器的CCSID。您的问题是,您的邮件包含UTF-8字符,但您是在信封中发送的,该信封将其描述为包含CCSID 850个字符。您只需更新发送邮件的信封,就可以正确地描述您的内容。在
我是ibmq专家和C程序员,但不是pymqi程序员,但是,看一下pymqi帮助和您的示例,我希望这些是您的代码所需的附加内容。在
pymqi帮助没有包含任何使用
CodedCharSetId
的示例,但是看起来MQMD
中的所有pymqi字段的拼写和大小写与“C”API头文件cmqc.h
中的字段完全相同。在请试试这个,看看能不能解决你的问题。在
相关问题 更多 >
编程相关推荐