以前已經知道傳送簡訊有70個字元的限制,但真到用的時候才發現還是不瞭解。中文英文各算幾個字元?一開始按照老想法,GB碼中文2個位元組英文一個位元組來算,按70個漢字的限制可以發140個位元組,但是發送的時候總是出錯。後來在網上查了下簡訊的編碼才知道,現在傳送簡訊通常使用PDU模式,摘抄一段:
在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編碼時,也是位元組數,等於原始短訊息的字元數的兩倍。
這下就明白了,發送帶中文的簡訊時是用UCS2編碼,無論中英文還是符號空格都是按一個字元算,總共70個,超過一個傳送簡訊就會出錯。而發送純英文簡訊時使用7-bit編碼,就可以發送160個字元了。
SmsManager有一個divideMessage函數,可以把要字串按照限制來分割成可以發的訊息。試了一下,確實可以用,不過有中文的時候分出來的簡訊是67個字元而不是70個,可能是和我用的聯想的測試機有關。在G1這些機子上不知道是否正常。
如果發送的簡訊有一段中文後面還有一段url,這時用divideMessage來機械的分就不好了,要把url單獨放在一條簡訊裡, 這時還是需要自己手動來分的。
作者 liujian885