還是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幾個不完善的地方。希望對碰到和我壹樣問題的同誌有點幫助。