當前位置:名人名言大全網 - 短信平臺 - 移動CMPP2.0短信網關返回的短信內容編碼怎麽轉換成中文的啊?謝謝!

移動CMPP2.0短信網關返回的短信內容編碼怎麽轉換成中文的啊?謝謝!

8的確是UCS2編碼..

還是UCS2 TO GB編碼的問題

我抄個答案吧:

漢字不同編碼轉換的問題 UCS2轉碼的心得

看到很多朋友都對漢字的unicode編碼有問題, 還需要什麽”unicode漢字對應表”...

壹直想回貼子,但太忙(包括忙著從論壇中索取自己需要的東西).

其實漢字的編碼轉換很簡單,我相信C++也應該有相應的函數.希望這些代碼對用Java的朋友有幫助.

/*

* UnicodeTest.java

*

* Created on July 29, 2003, 12:59 PM

*/

/**

*

* @author abc

* @version

*/

public class UnicodeTest

{

public static void main(String args[])

{

UnicodeTest UT = new UnicodeTest();

UT.test1();

}

public void test1()

{

String str = "測試信息abc123";

try

{

byte[] b = str.getBytes("GBK");

System.out.println(str + " -(GBK)編碼: " + bytesToHexStr(b));

System.out.println("");

str = new String(b, "GBK");

System.out.println("從GBK編碼 " + bytesToHexStr(b) + " 重新轉換為字串: " + str);

System.out.println("");

b = str.getBytes("UnicodeBigUnmarked");

System.out.println(str + " -(UCS2)編碼: " + bytesToHexStr(b));

System.out.println("");

str = new String(b, "UnicodeBigUnmarked");

System.out.println("從(UCS2)編碼 " + bytesToHexStr(b) + " 重新轉換為字串: " + str);

System.out.println("");

b = str.getBytes("ASCII");

System.out.println(str + " -(ASCII)編碼: " + bytesToHexStr(b));

System.out.println("");

}

catch(Exception e){}

}

private String bytesToHexStr(byte[] b)

{

if (b == null) return "";

StringBuffer strBuffer = new StringBuffer(b.length * 3);

for(int i = 0; i < b.length; i++)

{

strBuffer.append(Integer.toHexString(b & 0xff));

strBuffer.append(" ");

}

return strBuffer.toString();

}

}

運行此小程序的輸出結果是:

測試信息abc123 -(GBK)編碼: b2 e2 ca d4 d0 c5 cf a2 61 62 63 31 32 33

從GBK編碼 b2 e2 ca d4 d0 c5 cf a2 61 62 63 31 32 33 重新轉換為字串: 測試信息abc123

測試信息abc123 -(UCS2)編碼: 6d 4b 8b d5 4f e1 60 6f 0 61 0 62 0 63 0 31 0 32 0 33

從(UCS2)編碼 6d 4b 8b d5 4f e1 60 6f 0 61 0 62 0 63 0 31 0 32 0 33 重新轉換為字串: 測試信息abc123

測試信息abc123 -(ASCII)編碼: 3f 3f 3f 3f 61 62 63 31 32 33

這段時間都在做聯通的SP網關程序,原來我是做web應用的,對數據庫之類的java編程比較熟悉。原來也從來沒有接觸過短信網關方面的系統設計和編程。在這個過程中碰到了幾個比較棘手的問題,UCS2的轉碼就是其中壹個。

剛開始我們公司的業務沒有涉及到中文信息,所以沒有註意這個問題,用戶只需要發送字母和數字就可以了,但是最近幾天我在數據庫中發現了壹些亂碼,Messagecoding=8,我猜測可能和用戶手機的輸入法有關系,即使是阿拉伯數字也有雙字節的,比如“8”和“8”。

下面這段代碼是底層的API:

.........(read bytes from input)

//獲取消息編碼

MessageCoding = bodybytes[44];

//獲取短消息內容的長度

SGIP_Command.BytesCopy(bodybytes, abyte0, 45, 48, 0);

MessageLength = SGIP_Command.Bytes4ToInt(abyte0);

//創建壹個內容長度的Byte

MessageByte = new byte[MessageLength];

//將Message copy 到 MessageByte 中

SGIP_Command.BytesCopy(bodybytes, MessageByte, 49, (49 + MessageLength) - 1,0);

//開始解碼轉換

if(MessageCoding==8){//如果編碼格式為UCS2,就轉換成普通的String

try {

MessageContent = new String(MessageByte,"UnicodeBigUnmarked");

} catch (UnsupportedEncodingException e) {

}

}else{

MessageContent = new String(MessageByte);

}

實際上在java中就只需要壹句MessageContent = new String(MessageByte,"UnicodeBigUnmarked");就可以轉換過來,再保存到數據庫中就不會是亂碼了。

進行轉換後,我還用了另外壹個函數把類似“8”這樣的GBK編碼的阿拉伯數字都轉換成了ASCII的數字。這樣對業務邏輯有幫助。

還有壹點要說明壹下,GB2312是壹個比較早版本的中文編碼格式,GBK是新的中文編碼格式,GBK是GB2312的超集,GB2312是GBK的真子集。

我的底層API是使用的英斯克的底層api,不過我修改了英斯克的API幾個不完善的地方。希望對碰到和我壹樣問題的同誌有點幫助。