最近在嘗試使用ActiveMQ做系統(tǒng)間的繼承,當(dāng)然少不了Java和C++客戶端的交互問(wèn)題。由于Java與C++在字符串上采用了不同方式的編碼 (Java-Unicode, C++ - ascii)造成了文本數(shù)據(jù)傳輸過(guò)程中的編碼問(wèn)題, 下面記錄一下解決方
環(huán)境:
C++ 端:
操作系統(tǒng): Win7
JMS客戶端: CMS 1.0 (新版本的CMS需要VS2008編譯)
開(kāi)發(fā)環(huán)境: VS2005
Java端:
操作系統(tǒng): WinXp
JMS客戶端: ActiveMQ5.4.1-Core
開(kāi)發(fā)環(huán)境: JDK1.6.22
ActiveMQ:
ActiveMQ 5.4.1
解決方法:
根據(jù)JMS API對(duì)Message類別的定義,最適合多語(yǔ)言見(jiàn)交互的Message類型應(yīng)該是BytesMessage和TextMessage。由于 BytesMessage的readUTF方法在CMS1.0中,接收J(rèn)ava端發(fā)出的UTF字符時(shí)會(huì)拋出異常,導(dǎo)致BytesMessage不好使用;壞賬
TextMessage中,無(wú)論C++端以哪種格式的數(shù)據(jù)setText() , Java端接收到的數(shù)據(jù)都是以ISO-8859-1 格式編碼的字符。所以統(tǒng)一在發(fā)送和接收時(shí)都采用 ISO-8859-1 的方式進(jìn)行數(shù)據(jù)傳輸
發(fā)送時(shí)的代碼:
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();
}
}
接收時(shí)的代碼:
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();
}
}