posts - 241,  comments - 116,  trackbacks - 0

                  最近在嘗試使用ActiveMQ做系統間的繼承,當然少不了Java和C++客戶端的交互問題。由于Java與C++在字符串上采用了不同方式的編碼 (Java-Unicode, C++ - ascii)造成了文本數據傳輸過程中的編碼問題, 下面記錄一下解決方

          環境:

          C++ 端:

          操作系統:         Win7

          JMS客戶端:     CMS 1.0 (新版本的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方法在CMS1.0中,接收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();
                  }
              }

          posted on 2011-05-06 10:15 墻頭草 閱讀(6155) 評論(5)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 尤溪县| 万全县| 武威市| 信阳市| 平潭县| 台山市| 潮安县| 通道| 定南县| 新郑市| 新津县| 敦煌市| 丘北县| 昔阳县| 清丰县| 龙川县| 洛阳市| 延寿县| 栾川县| 五台县| 阿巴嘎旗| 内乡县| 卓资县| 敖汉旗| 家居| 庄浪县| 乐陵市| 隆尧县| 连州市| 正定县| 宣恩县| 丰宁| 建始县| 甘泉县| 鞍山市| 郑州市| 会东县| 邢台市| 商河县| 柳江县| 麻栗坡县|