簡介:SMS的編碼方式,在3GPP標准的3G TS 23.038和3G TS 23.040有詳細的介紹,在本文中,只介紹SMS呈現給用戶的內容的編碼方式,即7bit和UCS2的編碼方式。
1. 總體介紹
在3G TS 23.040中,9.2.2 PDU Type repertoire at SM-TL中,有介紹六種類型的SMS,其中五種都有TP-User-Data的域,這部分的呈現也就是我們看到的SMS內容。
在3G TS 23.038中,4 SMS Data Coding Scheme中,有如下信息:
<1>. SMS的三種編碼方式,7bit、8bit和UCS2編碼。8bit編碼工作中很少遇到,也比較簡單,這里不做說明。
<2>. TP-User-Data域的長度是140 octets。這140個字節如果保存7bit信息,最多可以保存160個7bit字符,如果保存UCS2編碼,最多可以保存70個字符。
TP-User-Data包含的字符,除了SMS內容外,還有可能在開始的部分包含Header信息(由TP-UDHI來指示是否攜帶),Header信息占用的部分,是作為SMS控制使用的,不能呈現給用戶。
2. 不帶Header信息的7bit TP-User-Data
現在我發送一條短消息給手機,內容為I love you.,如果手機接收后是存在SIM卡上的,你可以在SIM的6F3C域(3G TS 11.11 10.5.3 EFsms(Short messages))查看該消息內容:
01 04 81 21 43 F5 00 0B 81 51 28 39 58 71 F1 00 00 21 11 90 50 03 80 00 0B 49 10 FB 6D 2F 83 F2 EF BA 0B
因為是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type來幫助解析:
01 04 81 21 43 F5 00 //前面部分,可不關注,有需要的同學自行研究
0B 81 51 28 39 58 71 F1 //TP-OA,發送SMS的手機號碼
00 //TP-PID
00 //TP-DCS, 3G TS 23.038里可以了解這里表示7bit編碼方式
21 11 90 50 03 80 00 //TP-SCTS, 時間戳
0B //TP-User-Data-Length,這里為11個字符長度,也就是”I love you.”的字符個數
49 10 FB 6D 2F 83 F2 EF BA 0B //TP-User-Data
對TP-User-Data進行解析,7bit是壓縮過的,這里要把11個7bit數據提取出來:
0x49:0100 1001 第一個字符,高位添0,就是0100 1001,0x49,7bit編碼表為’I’
0x10:0001 0000 第二個字符,就是0010 0000,0x20,7bit編碼表為’ ’
0xFB:1111 1011 第三個字符,就是0110 1100,0x6C,7bit編碼表為’l’
0x6D:0110 1101 第四個字符,就是0110 1111,0x6F,7bit編碼表為’o’
0x2F:0010 1111 第五個字符,就是0111 0110,0x76,7bit編碼表為’v’
0x83:1000 0011 第六個字符,就是0110 0101,0x65,7bit編碼表為’e’
0xF2:1111 0010 第七個字符,就是0010 0000,0x20,7bit編碼表為’ ’
第八個字符,就是0111 1001,0x79,7bit編碼表為’y’
0xEF:1110 1111 第九個字符,就是0110 1111,0x6F,7bit編碼表為’o’
0xBA:1011 1010 第A個字符,就是0111 0101,0x75,7bit編碼表為’u’
0x0B:0000 1011 第B個字符,就是0010 1110,0x2E,7bit編碼表為’.’
上面的7bit編碼表可以在3G TS 23.038 6.2.1 GSM 7 bit Default Alphabet查閱,看到這里大家就明白了如何把呈現給用戶的內容從7bit的PDU數據里解析出來了。
3. 帶Header信息的7bit TP-User-Data

上圖用Now SMS發送下面消息給15829385171的手機,最終保存在SIM卡上的數據如下所示:
01 08 91 68 31 08 20 01 05 F0 44 0D 91 68 51 02 71 82 61 F4 00 D8 21 10 20 71 42 12 00 11 04 01 02 00 01 24 41 EC B7 BD 0C CA BF EB 2E
因為是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type來幫助解析:
01 08 91 68 31 08 20 01 05 F0 //前面部分,可不關注
44 //bit 6表示UDHI,這里bit6為1,則表明TP-User-Data有Header信息
0D 91 68 51 02 71 82 61 F4 //TP-OA
00 //TP-PID
D8 //TP-DCS, 3G TS 23.038里可以了解這里表示7bit編碼方式
21 10 20 71 42 12 00 //TP-SCTS, 時間戳
11 //TP-User-Data-Length,這里為17個字符長度
04 01 02 00 01 24 41 EC B7 BD 0C CA BF EB 2E //TP-User-Data
對TP-User-Data進行解析:
04 01 02 00 01,04表示Header的長度為4個字節(不包含04本身),這里有5個字節,也就是說TP-User-Data的17個字節,包含了5個字節的Header信息,其余的部分為可呈現給用戶的內容。
和上面不帶Header信息的7bit TP-User-Data的內容同為”I love you.”,為什么這里除去Header后的TP-User-Data剩余部分,和上面不一致呢?
不帶Header的”I love you.” 7bit編碼: 49 10 FB 6D 2F 83 F2 EF BA 0B
帶Header的”I love you.” 7bit編碼: 24 41 EC B7 BD 0C CA BF EB 2E
原因是不帶Header,則7bit是從第一個字節的第0位開始填充;而帶Header的內容要和早期不允許帶Header的7bit編碼兼容,那么Header之后的部分,要留給bit位填充0值來padding保證兼容性。這里比較繞口,下面實例解釋:
例如:這里Header的總長為5bytes,呈現給用戶的數據時從第6bytes開始的,則第6bytes留出的bit位個數為:7 – (5*8%7) = 7 – 5 = 2
也就是說為兼容不帶header信息的老版本:那么前面5個字節可以容納5個7bit數據,並有5個bit位供下一個7bit數據使用,則第6個字節需要留出2bit和前面5bit組成一個7bit數據。
下面解析這部分內容:
0x24:0010 0100 這2個bit為padding位,用0填充
0x41:0010 0001 第一個字符,就是0100 1001,0x49,7bit編碼表為’I’
第二個字符,就是0010 0000,0x20,7bit編碼表為’ ’
0xEC:1110 1100 第三個字符,就是0110 1100,0x6C,7bit編碼表為’l’
0xB7:1011 0111 第四個字符,就是0110 1111,0x6F,7bit編碼表為’o’
0xBD:1011 1101 第五個字符,就是0111 0110,0x76,7bit編碼表為’v’
0x0C:0000 1100 第六個字符,就是0110 0101,0x65,7bit編碼表為’e’
0xCA:1100 1010 第七個字符,就是0010 0000,0x20,7bit編碼表為’ ’
0xBF:1011 1111 第八個字符,就是0111 1001,0x79,7bit編碼表為’y’
0xEB:1110 1011 第九個字符,就是0110 1111,0x6F,7bit編碼表為’o’
第A個字符,就是0111 0101,0x75,7bit編碼表為’u’
0x2E:0010 1110 第B個字符,就是0010 1110,0x2E,7bit編碼表為’.’
4. 不帶Header信息的UCS2 TP-User-Data
現在我發出一條短消息,內容為”我愛你。”,如果手機接收后是存在SIM卡上的,你可以在SIM的6F3C域(3G TS 11.11 10.5.3 EFsms(Short messages))查看該消息內容:
05 00 11 00 0B 81 51 28 39 58 72 F1 00 08 FF 08 62 11 72 31 4F 60 30 02
因為是接收到的信息,可以用3G TS 23.040 9.2.2.2 SMS-SUBMIT type來幫助解析:
05 00 11 00 //前面部分,可不關注,有需要的同學自行研究
0B 81 51 28 39 58 72 F1 //TP-OA,接收SMS的手機號碼
00 //TP-PID
08 //TP-DCS, 3G TS 23.038里可以了解這里表示UCS2編碼方式
FF //TP-VP
08 //TP-User-Data-Length,這里為8個字符長度,也就是”我愛你。”的2倍
62 11 72 31 4F 60 30 02 //TP-User-Data
對TP-User-Data進行解析,UCS2兩個字節表示一個UCS2字符,組合如下:
0x6211,第一個字符,UCS2為“我”
0x7231,第二個字符,UCS2為“愛”
0x4F60,第三個字符,UCS2為“你”
0x3002,第四個字符,UCS2為“。”
查詢Unicode編碼(UCS2在這里可等同為Unicode,如要了解差別,可去外網查詢相關文章了解)的方法如下: 開始à程序à附件àTrueType造字程序,進入造字階段后,選擇:窗口à參照à輸入編碼就可以看到了。
5. 帶Header信息的UCS2 TP-User-Data

上圖用Now SMS發送下面消息給15829385171的手機,最終保存在SIM卡上的數據如下所示:
01 08 91 68 31 08 20 01 05 F0 44 0D 91 68 51 02 71 82 61 F4 00 E8 21 10 20 71 52 22 00 0D 04 01 02 00 01 62 11 72 31 4F 60 30 02
因為是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type來幫助解析:
01 08 91 68 31 08 20 01 05 F0 44
0D 91 68 51 02 71 82 61 F4
00
E8 //TP-DCS, 3G TS 23.038里可以了解這里表示UCS2編碼方式
21 10 20 71 52 22 00
0D //TP-User-Data-Length,這里為13個字符長度
04 01 02 00 01 62 11 72 31 4F 60 30 02 //TP-User-Data
對TP-User-Data進行解析:
04 01 02 00 01,為Header部分
之后為可呈現給用戶的數據部分:
62 11 72 31 4F 60 30 02
0x6211,第一個字符,UCS2為“我”
0x7231,第二個字符,UCS2為“愛”
0x4F60,第三個字符,UCS2為“你”
0x3002,第四個字符,UCS2為“。”
