熊 棠,唐 勇
(武警四川總隊 通信網絡管理中心,成都 610015)
網絡SMS應用中有關有效數據長度控制的算法分析
熊 棠,唐 勇
(武警四川總隊 通信網絡管理中心,成都 610015)
針對基于網絡短信息服務的有效數據長度控制的問題,提出了“逐字修正”和“超閾回滾”2種實現算法,并設計了2種算法的實現腳本。針對2種算法流程的不同,結合實際使用中數據的特點,比較了2種算法的優缺點;并針對可能出現的錯誤,提出了優化后的算法。借助瀏覽器插件,設計實驗進行了定量分析,實驗結果證實了算法分析階段的預測結果。
文本長度限制;算法;腳本效率
隨著網絡技術的快速發展,基于網絡的短信息服務(Short Message Service,SMS)由于其平臺的開放性、便捷性和可移動性,逐漸成為快速廣播應用的首選平臺。SMS通常對信息長度有一定的限制,例如國內主要從事GMS網絡運營的ISP將SMS服務中單條SMS信息內容限制為70個字(140字節)。即使使用GSM短信分割協或采用CDMA等支持更長信息服務的基礎網絡,為了減輕網絡壓力,也需要對數據長度作出限制,因此,有必要在輸入端瀏覽器限制文本的輸入。目前常用的限制文本長度的腳本通常存在中文字符兼容性不好、瀏覽器兼容性差等問題。據此,提出2種算法,可以準確完成英文字母、數字、符號及中文字符混用情況下的文本長度控制。采用跨瀏覽器的Javascript腳本實現算法,并采用一種直觀準確的檢測方法,測試腳本的效率;使該腳本的運行不受文本長度變化的影響,并能符合用戶通常的使用習慣。
用戶的需求主要有3種:1)用戶在客戶端(Internet Explorer 6.0瀏覽器及同系列更高版本、Firefox 3.5瀏覽器及同系列更高版本,后續分析及實現均以此兩系列瀏覽器為基礎[1]。)輸入文本,客戶端顯示還可輸入的文字數量,隨操作自動更新。2)當文本長度達到預設定值的時候,禁止輸入,文本鎖定。3)充分考慮用戶操作習慣。腳本應在逐字輸入、外部粘貼等操作下均能正確執行。針對以上3種需求,算法分析如下:
1)觸發動作
考慮需求3),腳本應在對象文本區域(Textarea)執行按鍵、點擊事件時均激活。即在 onclick、onmousedown、onkeyup事件時激活腳本。同時,在表單提交之前,對所有表單對象進行格式化檢查時再執行一次腳本。
2)文本長度檢查
在Javascript腳本(以下簡稱JS)中,字符串對象有length屬性,表示了字符串的長度。但是JS中,將單字節文本與雙字節文本做相同處理,例如“測試”這樣的2個漢字的字符串,在JS中的length屬性為2,這與實際數據傳輸與存儲是需要占用4個字節的情況不符。因此,需要構建1個函數(function),得到1個可能包含單字節字符及雙字節字符的字符串的準確字節數。
字符串對象存在charCodeAt()方法,返回在指定位置字符的萬國碼(以下簡稱Unicode)編碼[2]。Unicode及網頁常用的GB2312、GB18038、UTF-8等字符集通常都向下兼容ASCII碼,因此,使用charCodeAt()方法返回值大于007F(16進制)時,表明字符串對應的該位置字符要占用2個字節,反之占用1個字節[3]。
3)余字提示
得到當前字符串所占字節長度后,以設定值(字節數)與當前值之差除2,得到還可以輸入的文字個數,并將結果作為頁面元素顯示出來。
4)長度控制
長度檢查隨輸入激活,當腳本檢查到長度超過設定值時,應將長度鎖定在最長狀態。
按照以上需求,可以有2種方式實現長度控制。
該算法的流程是:檢查當前文本長度,如果超過設定值,將文本域中的字符串取不大于設定值長度的子字符串,并將子字符串值賦給文本域對象。在一個循環過程中將當前字符串對象逐字符添加到1個臨時字符串后面,然后檢查臨時字符串所占的字節長度;當長度超過設定值時,跳出循環,并得到當前位置減1為最長字符串。將結果賦值給文本域對象并鎖定。該算法適應性強,但代碼繁復,運算量大。
該算法的流程是:檢查當前文本長度,如果未超過設定值,將文本賦值給一個全局性的對象;如果超過設定值,從全局性對象中取值賦給文本域對象。全局性對象可以為全局變量,也可以為表單對象。此處以全局變量為例加以說明。聲明全局變量TempStr;對當前字符串對象進行長度檢查,如果未超過設定值,將字符串對象值賦給全局變量TempStr;如果超過設定值,則取TempStr的值,并將其賦給文本域對象并鎖定。該算法程序簡潔,運算量低,但實際使用中存在局限性。下面將說明并優化。
使用Javacript腳本實現上述算法的實現。按照上述分析,可以將腳本分為3個部分,分別對應長度檢查、余字顯示和長度控制。
聲明函數GetStrLen(Str)作為實現長度檢查的腳本,其中Str為待檢查的字符串。


聲明函數LastWords(tagID,NowLength MaxLen)作為實現余字顯示的腳本,其中tagID為頁面上顯示剩余字數的容器ID,NowLength為當前字符串所占字節長度,MaxLen為設定的最大字節數。

聲明函數CHGLeftWords(obj,tagID,MaxLen)作為頁面對象事件激活動作,并在此函數中處理長度控制。其中obj為頁面表單中的文本域對象,tagID為頁面上顯示剩余字數的容器ID,MaxLen為設定的最大字節數。
1)算法一的實現:

2)算法二的實現:


算法二比算法一簡潔、運算量少,運算量不會由于字符串長度的變化而增加,適合于較長文本的控制;但是當用戶從瀏覽器外部采用復制粘貼方式提交數據時,如果文本超過長度,因為全局變量此時處于初始狀態,會將文本域賦值為空。
采用算法一與算法二相結合的方式:在一般情況中用算法二處理,簡潔高效;當算法二失效的情況下,采用算法一處理。腳本實現如下:


在實際使用中,算法二(特別是適應性改造后的算法二)與算法一相比,哪個效率更高呢?這就需要設計一個實驗,以定量分析的方式得出結論。
前端腳本運算效率涉及很多方面,對于用戶體驗來講,最直接的就是運行時間;對于上述2種算法的效率比較,可以簡化為完成同樣處理工作的時長對比。
為了排除客戶端系統資源分配對于測試結果的影響,需要使用相對時間長度來進行比較;同時為了排除客戶端系統中斷的影響,需要在同樣輸入條件下進行多次測試來降低誤差[4]。
在Firefox 3.6下,使用開源插件Firebug 1.6.0測試腳本運行時間[5]。測試操作方法為:
1)測試環境為 Windows xp+SP3、Firefox 3.6。
2)每次測試前清空瀏覽器緩存,刷新頁面。
3)測試數據分3組,分別為140字節、255字節和1 024字節,輸入方式為手工輸入。
4)每組數據在Firefox 3.6下分別測試5次,記錄下讀數。
表1為測試記錄:

表1 不同字節文本條件下2種算法的耗費時間對比單位:ms
由表1分析可知:
1)算法一在同等輸入條件較下較算法二效率低;
2)算法一在需要處理的數據長度增加時,運行時間急劇增加;算法二受數據長度影響很小。
實驗結果與理論分析結果一致。
通過上述分析及測試可以看出,采用不同的算法對腳本的執行效率有很大的影響。采用低效率的算法,最終結果可能會嚴重影響用戶的使用體驗,進而造成用戶對該系統的抵觸。
[1]FLANAGAN D.JavaScript權威指南[M].李強,譯.5版.北京:機械工業出版社,2007.
[2]CROCKFORD D.JavaScript語言精粹[M].趙澤,譯.北京:電子工業出版社,2009.
[3]EVERSON M,MCGOWAN R,WHISTLER K,et al.Roadmap to the BMP[DB/OL].(2011-06-23)[2011-03-12].http://www.unicode.org/roadmaps/bmp/.
[4]KEITH J.JavaScript DOM編程藝術[M].楊濤,譯.北京:人民郵電出版社,2006.
[5]VOLCANO.初識 Firebug[J].程序員,2007(3):120-121.
Algorithm of Data Length Control in Web SMS Applications
XIONG Tang,TANG Yong
(Communication Management Center,Sichuan Brigade of Armed Police,Chengdu 610015,China)
This paper focuses on the effective data length control of network-based short message service.Two algorithms of“Always Correct”and“Over-threshold Rollback”are proposed.The advantages and disadvantages of these two algorithms are compared in combination with their individual arithmetic and features in use.An optimized algorithm is considered according to the possible errors in applications.The experiments for quantitative analysis are designed and the results verify the effectiveness of proposed algorithm.
data length control;algorithm;efficiency
TP301.6
A
1008-5440(2011)03-0018-05
2011-04-20
熊棠(1982-),男(漢族),重慶人,助理工程師,學士,研究方向:網站構架與應用。
唐勇(1977-),男(漢族),四川安岳人,工程師,學士,研究方向:網絡優化與網絡管理。