六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

SMS中用Unicode編碼發送中文

[摘要]SMS是由Esti 所制定的一個規范(GSM 03.40 和 GSM 03.38)。有兩種方式來發送和接收SMS消息:文本模式或者PDU(protocol description unit)模式。文...

SMS是由Esti 所制定的一個規范(GSM 03.40 和 GSM 03.38)。有兩種方式來發送和接收SMS消息:文本模式或者PDU(protocol description unit)模式。文本模式只能發送普通的ASCII字符,而要發送圖片、鈴聲、其它編碼的字符(如中文)就必須采用PDU模式。

       PDU模式中,可以采用三種編碼方式來編碼要發送的內容,分別是 7-bit編碼、8-bit編碼、16-bit編碼。7-bit編碼用于發送普通的ASCII字符;8-bit編碼通常用于發送數據消息,比如圖片和鈴聲等;而16-bit編碼用于發送Unicode字符。在這三種編碼方式下,可以發送的最大字符數分別是 160、 140、 70。

       若要發送中文(或日文等),必須采用PDU模式的Unicode編碼方式。

我最近參與了一個在linux下收發短信的項目。其中,需要實現中文的發送和接收。由于原來沒有中文編碼、Unicode編碼的經驗,所以查了一些資料,也在一些論壇上提了一些問題,F在把它整理出來,希望對以后再做類似項目的朋友有個幫助。我寫的比較簡單,關于PDU的規范,可以看這里:http://www.ascend-tech.com.cn/sustain/SMS_PDU-mode.pdf ,或者去wavecom的網站上找找看。

 

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

 

在 Redhat 7.3系統上,默認是用GB2312編碼保存中文字符的(對于中英文混合的文本也是如此)。所以首先需要把 GB2312 編碼的字符串轉換到 Unicode編碼的字符串。GB2312編碼是一種多字節編碼方式,對于中文,用2個字節表示,對于英文,用1個字節表示,就是英文的ascii碼。(注:我沒有仔細看過GB2312編碼的規范,以上理解是實際開發中得出來的,不能保證正確性)。Unicode編碼是雙字節編碼方式,對所有字符,都采用2個字節編碼。在linux平臺上,GB2312編碼到Unicode編碼的轉換,可以有三種實現方式(或者更多):

1)、用 mbstowcs () 函數。就是多字節編碼到寬字符的轉換。我試過它,可以正確的轉換,但是這個函數可能不是很可靠。

 

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

 

3)、用 iconv () 函數。這可能是linux上的標準的方法,不僅可以轉換GB2312到Unicode,還可以在任意的兩種編碼之間轉換(前提是linux系統要支持這些編碼)。

首先要用 iconv_open(), 打開一個轉換句柄,指定兩種轉換前的編碼和轉換后的編碼。

然后用 icnov() 作轉換。最后用 iconv_close()關閉句柄,釋放資源。

#include <iconv.h>

 

#define BUFLEN 200

char inbuf[BUFLEN];

char outbuf[BUFLEN];

char* pin = inbuf;

char* pout = outbuf;

 

…打開文件,讀入GB2312數據到inbuf,數據長度為 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 () 時,需要注意參數的使用,inleft 是輸入緩沖區數據數據長度,outleft是輸出緩沖區大小。(需要保證輸出緩沖區足夠大)。

轉換以后,outleft 是outbuf中空閑空間的大小,所以 BUFLEN-outleft 才是真正的Unicode數據長度。

注意:不論是GB2312編碼,還是Unicode編碼,在內存中都是一些字節序列,所以我們可以統一用 類型為 char(或者unsigned char)的字符數組來保存。所以,BUFLEN-outleft 是 字符(char)個數,而不是Unicode字符個數。

 

 

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

 

在得到 Unicode編碼以后,還需要轉換到 PDU 的16-bit 編碼,才可以正確的發送。在這個轉換過程中,需要注意兩點:

1)、Unicode 編碼最開始的 0xFEFF標志要被去除,在0xFEFF之后的內容,才是真正的Unicode字符。(至于為什么有這個0xfeff標志,知道的朋友告訴我一聲,呵呵)。

 

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

 

3)、為了將0x4E2D 的Unicode編碼轉換到 “4E2D” 的16-bit編碼,可以用 sprintf(buf,  “%02X”,  outbuf[i]) 對每一個字節作轉換。

 

 

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

       PDU規范中,需要包括消息體的長度,這里你要小心計算。

 

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

 

在PDU格式中,First-Octet 、TP-MR、TP-PID、TP-DCS、TP-VP的設置正確與否,對能否發送 Unicode 至關重要。根據協議規范以及我的調試結果,以上幾個標志的正確設置分別為(都是16進制):

First-Octet : 11    

TP-MR :      00

TP-PID :      00

TP-DCS :     08    (編碼方式,16-bit)

TP-VP :              A7          

 

       經過以上步驟,已經可以做到發送中文字符了。

希望這篇文檔,能為準備在linux下做短信開發的朋友提供一些幫助。

       

 

參考資料:

★ An introduction to the SMS in PDU mode GSM Recommendation phase 2



主站蜘蛛池模板: 性国产 | 天天干天天在线 | 天天草狠狠干 | 日本男人的天堂 | 特一级黄色大片 | 诱惑网综合 | 深爱五月激情五月 | 日韩丝袜亚洲国产欧美一区 | 亚洲手机在线手机观看高清hd | 亚洲第一成人影院 | 亚洲国产精品久久久久 | 天天躁狠狠躁夜躁2021 | 天堂网在线资源 | 午夜大片在线观看 | 色姝姝影院 | 日韩免费视频一区 | 日韩视频第一页 | 亚洲欧洲日韩在线 | 中国美女牲交一级毛片 | 天天做天天爱天天干 | 伊人网网站| 亚洲欧美日韩专区一 | 香港三级理论在线观看网站 | 日韩欧美国产另类 | 做a的视频免费 | 手机看片福利盒子久久 | 天天干天天干天天干天天干 | 日韩尤物| 日本mv精品中文字幕 | 亚洲欧美日韩在线精品一区二区 | 日韩网站在线观看 | 日本狠狠干 | 人人爱人人做 | 日韩啪啪网 | 中文区永久区乱码六区 | 自拍视频第一页 | 日韩午夜 | 天天干天天爱天天射 | 日本高清色视频www 日本高清色本在线www游戏 | 亚洲精品老司机 | 青娱乐91在线 |