Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> 談談Android中文短信的實現

談談Android中文短信的實現

編輯:初級開發

 似乎Google在推出G1時就沒有考慮多國問題,android在發送短信時在編碼上處理不是很妥當,在收發一些unicode來實現的國家文字上存在很大的漏洞,比如中文、日文、俄文等等。對於分析短信發送可以直接dump出PDU Header來解決這個問題。兩個G1手機只要在截取短信時,比如獲取收到短信時判斷PDU的原始內容,比較後就不難得出解決方法。

 我們在構造時直接通過一個二進制的字節數組來發送UCS2即可,而英文使用7位的編碼可以減少字節占用,在一條短信中發送更多的字符內容,稍後我們提供android中文短信發送的所有源代碼。

  下面引用過去的分析內容:

  發送短消息常用Text和PDU(Protocol Data Unit,協議數據單元)模式。使用Text模式收發短信代碼簡單,實現起來十分容易,但最大的缺點是不能收發中文短信;而PDU模式不僅支持中文短信,也能發送英文短信。PDU模式收發短信可以使用3種編碼:7-bit、8-bit和UCS2編碼。7-bit編碼用於發送普通的ASCII字符,8-bit編碼通常用於發送數據消息,UCS2編碼用於發送Unicode字符。一般的PDU編碼由A B C D E F G H I J K L M十三項組成。
A:短信息中心地址長度,2位十六進制數(1字節)。
B:短信息中心號碼類型,2位十六進制數。
C:短信息中心號碼,B+C的長度將由A中的數據決定。
D:文件頭字節,2位十六進制數。
E:信息類型,2位十六進制數。
F:被叫號碼長度,2位十六進制數。
G:被叫號碼類型,2位十六進制數,取值同B。
H:被叫號碼,長度由F中的數據決定。
I:協議標識,2位十六進制數。
J:數據編碼方案,2位十六進制數。
K:有效期,2位十六進制數。
L:用戶數據長度,2位十六進制數。
M:用戶數據,其長度由L中的數據決定。J中設定采用UCS2編碼,這裡是中英文的Unicode字符。

PDU編碼協議簡單說明

例1 發送:SMSC號碼是+8613800250500,對方號碼是13693092030,消息內容是“Hello!”。從手機發出的PDU串可以是
08 91 68 31 08 20 05 05 F0 11 00 0D 91 68 31 96 03 29 30 F0 00 00 00 06 C8 32 9B FD 0E 01
對照規范,具體分析:
分段 含義 說明
08 SMSC地址信息的長度 共8個八位字節(包括91)
91 SMSC地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,補‘F’湊成偶數個
11 基本參數(TP-MTI/VFP) 發送,TP-VP用相對格式
00 消息基准值(TP-MR) 0
0D 目標地址數字個數 共13個十進制數(不包括91和‘F’)
91 目標地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
68 31 96 03 29 30 F0 目標地址(TP-DA) 8613693092030,補‘F’湊成偶數個
00 協議標識(TP-PID) 是普通GSM類型,點到點方式
00 用戶信息編碼方式(TP-DCS) 7-bit編碼
00 有效期(TP-VP) 5分鐘
06 用戶信息長度(TP-UDL) 實際長度6個字節
C8 32 9B FD 0E 01 用戶信息(TP-UD) “Hello!”

例2 接收:SMSC號碼是+8613800250500,對方號碼是13693092030,消息內容是“你好!”。手機接收到的PDU串可以是
08 91 68 31 08 20 05 05 F0 84 0D 91 68 31 96 03 29 30 F0 00 08 30 30 21 80 63 54 80 06 4F 60 59 7D 00 21
對照規范,具體分析:
分段 含義 說明
08 地址信息的長度 個八位字節(包括91)
91 SMSC地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,補‘F’湊成偶數個
84 基本參數(TP-MTI/MMS/RP) 接收,無更多消息,有回復地址
0D 回復地址數字個數 共13個十進制數(不包括91和‘F’)
91 回復地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
68 31 96 03 29 30 F0 回復地址(TP-RA) 8613693092030,補‘F’湊成偶數個
00 協議標識(TP-PID) 是普通GSM類型,點到點方式
08 用戶信息編碼方式(TP-DCS) UCS2編碼
30 30 21 80 63 54 80 時間戳(TP-SCTS) 2003-3-12 08:36:45  +8時區
06 用戶信息長度(TP-UDL) 實際長度6個字節
4F 60 59 7D 00 21 用戶信息(TP-UD) “你好!”


若基本參數的最高位(TP-RP)為0,則沒有回復地址的三個段。從Internet上發出的短消息常常是這種情形。
注意號碼和時間的表示方法,不是按正常順序順著來的,而且要以‘F’將奇數補成偶數。


在PDU Mode中,可以采用三種編碼方式來對發送的內容進行編碼,它們是7-bit、8-bit和UCS2編碼。7-bit編碼用於發送普通的ASCII字符,它將一串7-bit的字符(最高位為0)編碼成8-bit的數據,每8個字符可“壓縮”成7個;8-bit編碼通常用於發送數據消息,比如圖片和鈴聲等;而UCS2編碼用於發送Unicode字符。PDU串的用戶信息(TP-UD)段最大容量是140字節,所以在這三種編碼方式下,可以發送的短消息的最大字符數分別是160、140和70。這裡,將一個英文字母、一個漢字和一個數據字節都視為一個字符。


需要注意的是,PDU串的用戶信息長度(TP-UDL),在各種編碼方式下意義有所不同。7-bit編碼時,指原始短消息的字符個數,而不是編碼後的字節數。8-bit編碼時,就是字節數。UCS2編碼時,也是字節數,等於原始短消息的字符數的兩倍。如果用戶信息(TP-UD)中存在一個頭(基本參數的TP-UDHI為1),在所有編碼方式下,用戶信息長度(TP-UDL)都等於頭長度與編碼後字節數之和。如果采用GSM 03.42所建議的壓縮算法(TP-DCS的高3位為001),則該長度也是壓縮編碼後字節數或頭長度與壓縮編碼後字節數之和。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved