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 墻頭草 閱讀(6176) 評論(5)  編輯  收藏

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


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 贵南县| 德化县| 二手房| 湘乡市| 鹿邑县| 濮阳县| 黑龙江省| 米泉市| 东阿县| 永平县| 贞丰县| 山西省| 河南省| 思茅市| 房产| 修文县| 林州市| 重庆市| 延边| 津南区| 靖州| 武冈市| 冕宁县| 文登市| 赤城县| 淳化县| 岳池县| 依兰县| 青河县| 乐昌市| 开鲁县| 都匀市| 鄂托克旗| 田林县| 通化市| 惠来县| 道孚县| 台东县| 黄浦区| 庄浪县| 卢龙县|