機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
SMS中用Unicode編碼發(fā)送中文
[1] [2]  下一頁
SMS中用Unicode編碼發(fā)送中文
 更新時間:2008-8-18 11:07:28  點擊數(shù):28
【字體: 字體顏色
SMS中用Unicode編碼發(fā)送中文

作者: 陳軼飛
最后更新: 2003-03-07
關鍵詞: SMS、PDU、Unicode、GB2312、linux、編碼轉換

SMS是由Esti 所制定的一個規(guī)范(GSM 03.40 和 GSM 03.38)。有兩種方式來發(fā)送和接收SMS消息:文本模式或者PDU(protocol description unit)模式。文本模式只能發(fā)送普通的ASCII字符,而要發(fā)送圖片、鈴聲、其它編碼的字符(如中文)就必須采用PDU模式。
PDU模式中,可以采用三種編碼方式來編碼要發(fā)送的內容,分別是 7-bit編碼、8-bit編碼、16-bit編碼。7-bit編碼用于發(fā)送普通的ASCII字符;8-bit編碼通常用于發(fā)送數(shù)據(jù)消息,比如圖片和鈴聲等;而16-bit編碼用于發(fā)送Unicode字符。在這三種編碼方式下,可以發(fā)送的最大字符數(shù)分別是 160、 140、 70。
若要發(fā)送中文(或日文等),必須采用PDU模式的Unicode編碼方式。
我最近參與了一個在linux下收發(fā)短信的項目。其中,需要實現(xiàn)中文的發(fā)送和接收。由于原來沒有中文編碼、Unicode編碼的經(jīng)驗,所以查了一些資料,也在一些論壇上提了一些問題,F(xiàn)在把它整理出來,希望對以后再做類似項目的朋友有個幫助。我寫的比較簡單,關于PDU的規(guī)范,可以看這里:http://www.ascend-tech.com.cn/sustain/SMS_PDU-mode.pdf ,或者去wavecom的網(wǎng)站上找找看。

1、 GB2312 編碼到Unicode 編碼的轉換

在 Redhat 7.3系統(tǒng)上,默認是用GB2312編碼保存中文字符的(對于中英文混合的文本也是如此)。所以首先需要把 GB2312 編碼的字符串轉換到 Unicode編碼的字符串。GB2312編碼是一種多字節(jié)編碼方式,對于中文,用2個字節(jié)表示,對于英文,用1個字節(jié)表示,就是英文的ascii碼。(注:我沒有仔細看過GB2312編碼的規(guī)范,以上理解是實際開發(fā)中得出來的,不能保證正確性)。Unicode編碼是雙字節(jié)編碼方式,對所有字符,都采用2個字節(jié)編碼。在linux平臺上,GB2312編碼到Unicode編碼的轉換,可以有三種實現(xiàn)方式(或者更多):
1)、用 mbstowcs () 函數(shù)。就是多字節(jié)編碼到寬字符的轉換。我試過它,可以正確的轉換,但是這個函數(shù)可能不是很可靠。

2)、用 GB2312 à Unicode 的轉換表,手動查表轉換。網(wǎng)上有這樣的轉換表,你需要對每一個GB2312字符,根據(jù)它是中文字符還是英文字符,分別轉換。

3)、用 iconv () 函數(shù)。這可能是linux上的標準的方法,不僅可以轉換GB2312到Unicode,還可以在任意的兩種編碼之間轉換(前提是linux系統(tǒng)要支持這些編碼)。
首先要用 iconv_open(), 打開一個轉換句柄,指定兩種轉換前的編碼和轉換后的編碼。
然后用 icnov() 作轉換。最后用 iconv_close()關閉句柄,釋放資源。



#include <iconv.h>

#define BUFLEN 200
char inbuf[BUFLEN];
char outbuf[BUFLEN];
char* pin = inbuf;
char* pout = outbuf;

…打開文件,讀入GB2312數(shù)據(jù)到inbuf,數(shù)據(jù)長度為 len

int inleft = len;
int outleft = BUFLEN;

iconv_t cd;
if((cd = iconv_open(“gb2312”, “unicode”)) == (iconv_t)-1)
return –1;
if(iconv(cd, &pin, &inleft, &pout, &outleft) == (size_t)-1)
return –1;
iconv_close(cd);

使用 iconv () 時,需要注意參數(shù)的使用,inleft 是輸入緩沖區(qū)數(shù)據(jù)數(shù)據(jù)長度,outleft是輸出緩沖區(qū)大小。(需要保證輸出緩沖區(qū)足夠大)。
轉換以后,outleft 是outbuf中空閑空間的大小,所以 BUFLEN-outleft 才是真正的Unicode數(shù)據(jù)長度。
注意:不論是GB2312編碼,還是Unicode編碼,在內存中都是一些字節(jié)序列,所以我們可以統(tǒng)一用 類型為 char(或者unsigned char)的字符數(shù)組來保存。所以,BUFLEN-outleft 是 字符(char)個數(shù),而不是Unicode字符個數(shù)。


2、 Unicode 編碼到 16-bit 編碼的轉換

在得到 Unicode編碼以后,還需要轉換到 PDU 的16-bit 編碼,才可以正確的發(fā)送。在這個轉換過程中,需要注意兩點:
1)、Unicode 編碼最開始的 0xFEFF標志要被去除,在0xFEFF之后的內容,才是真正的Unicode字符。(至于為什么有這個0xfeff標志,知道的朋友告訴我一聲,呵呵)。

2)、Unicode 是雙字節(jié)字符,由于我的系統(tǒng)是小端字節(jié)序(little-endian),也就是說,在存儲的時候,是先低位,后高位,例如“中”的Unicode編碼是 0x4E2D,存儲的時候是 2D4E,在轉換到 16-bit編碼的時候,要注意這個順序的不同。當然,如果你的系統(tǒng)是大端字節(jié)序(big-endian),那么就不用這樣做了。

OK,關于如何將 0x4E2D 的Unicode編碼轉換到 “4E2D” 的16-bit編碼,我就不多寫了。


3、正確計算16-bit 編碼的消息體長度

4、正確設置 First-Octet 、TP-MR、TP-PID、TP-DCS、TP-VP

在PDU格式中,First-Octet 、TP-MR、TP-PID、TP-DCS、TP-VP的設置正確與否,對能否發(fā)送 Unicode 至關重要。根據(jù)協(xié)議規(guī)范以及我的調試結果,以上幾個標志的正確設置分別為(都是16進制):
First-Octet : 11
TP-MR : 00
TP-PID : 00
TP-DCS : 08 (編碼方式,16-bit)
TP-VP : A7

經(jīng)過以上步驟,已經(jīng)可以做到發(fā)送中文字符了。
希望這篇文檔,能為準備在linux下做短信開發(fā)的朋友提供一些幫助。


參考文獻:
★ An introduction to the SMS in PDU mode GSM Recommendation phase 2
  • 上一篇: 密集波分復用光網(wǎng)絡關鍵技術
  • 下一篇: 手機短信息SMS的程序開發(fā)
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1