专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  K 神!国产神级搜索引擎~太强了? ·  昨天  
字节跳动技术团队  ·  技术专题27期 | 后端Java技术创意冠军角逐赛 ·  2 天前  
字节跳动技术团队  ·  技术专题27期 | 后端Java技术创意冠军角逐赛 ·  2 天前  
芋道源码  ·  原来,这才是JDK推荐的线程关闭方式 ·  2 天前  
Java编程精选  ·  超越 MyBatis-Plus?来领略一下 ... ·  3 天前  
芋道源码  ·  推荐一个Java面试神器,太香了! ·  3 天前  
51好读  ›  专栏  ›  ImportNew

ActiveMQ 中 Java 与 C++ 交互中文乱码问题

ImportNew  · 公众号  · Java  · 2017-03-10 21:03

正文

(点击上方公众号,可快速关注)


来源:witcheryne,

witcheryne.iteye.com/blog/1032720

如有好文章投稿,请点击 → 这里了解详情


环境:


C++ 端:


  • 操作系统:         Win7

  • JMS客户端:     CMS 3.1.2 (新版本的CMS需要VS2008编译)

  • 开发环境:         VS2005


Java端:


  • 操作系统:          WinXp

  • JMS客户端:       ActiveMQ5.4.1-Core

  • 开发环境:           JDK1.6.22


ActiveMQ:


ActiveMQ 5.4.1


解决方法:


根据JMS API对Message类别的定义,最适合多语言见交互的Message类型应该是BytesMessage和TextMessage。由于BytesMessage的readUTF方法在CMS3.1.2中,接收Java端发出的UTF字符时会抛出异常,导致BytesMessage不好使用;


TextMessage中,无论C++端以哪种格式的数据setText() , Java端接收到的数据都是以ISO-8859-1格式编码的字符。所以统一在发送和接收时都采用 ISO-8859-1 的方式进行数据传输


发送时的代码:


private void writeTextMessage(String txt) {  

    try {  

        String msg = txt;         

 

        String iso = new String(txt.getBytes("GBK"), "ISO-8859-1");  

 

        TextMessage message = pubSession.createTextMessage();  

        message.setStringProperty("language", "java");  

        message.setText(iso);  

 

        pub.publish(message);  

 

    } catch (JMSException e) {  

        e.printStackTrace();  

    } catch (UnsupportedEncodingException e) {  

        e.printStackTrace();  

    }   

}


接收时的代码:


private void onTextMessage(TextMessage message) throws JMSException {  

    String txt = message.getText();  

 

    try {  

        String gbk = new String(txt.getBytes("ISO-8859-1"), "GBK");  

        System.out.println(gbk);  

    } catch (UnsupportedEncodingException e) {  

        e.printStackTrace();  

    }  

}


Update1: 2011-07-26 10:00。


CMS版本不是1.0版,应该是3.1.2。


看完本文有收获?请转发分享给更多人

关注「ImportNew」,看技术干货