其實這個不算是一個坑,阿里實現(xiàn)的字符串協(xié)議挺好的,但是由于我個人的強迫癥和在編寫php客戶端過程中對字符串的輸出和解析感覺很別扭,尤其是字符串數(shù)據(jù)很大時,必須一個字節(jié)一個字節(jié)的判斷處理,讓我很郁悶,明顯和我當年編寫匯編時的哪種精致不符。體現(xiàn)在兩個方面

1.字符串的格式定義為 字母S或者R + 兩個字節(jié)的數(shù)據(jù)長度(MSB)+ utf8格式的字節(jié)數(shù)組,S表示最后一個塊,上面那個長度是unicode 

字符串的長度,不是自己數(shù)組的長度,即"中國"這個詞,長度是2,utf8表示的字節(jié)數(shù)組確實6個字節(jié)

2.我的php客戶端是用c混合c++編寫的php擴展,輸出字符串時首先調(diào)用libmbfl庫計算unicode字符串的長度,然后輸出utf8數(shù)據(jù),因為在php中,我們默認采用utf8格式,字符串zval已經(jīng)是utf8格式了,并且附帶一個utf8長度的整數(shù),

3.讀取應答分析字符串時,根據(jù)上面的長度并不知道該分配多少內(nèi)存來接受整個字符串,因為長度和utf8的字節(jié)長度根本沒有關(guān)系,還有多個節(jié)時防止utf8字母被分配到多個不同的chunk上面

4.因此,我們重新定義了一個字符串數(shù)據(jù)協(xié)議, E +4字節(jié)UTF8字節(jié)長度(MSB)+ utf8表示一個完整的字符串,4字節(jié)時,表示的數(shù)據(jù)有2^31-1個utf8字節(jié),可以表示好幾百兆的漢字,夠用了,這樣我們可以使用c語言的memcpy函數(shù)進行快速數(shù)據(jù)拷貝和數(shù)據(jù)緩沖區(qū)分配了

5.經(jīng)過測試,大量字符串的數(shù)據(jù)傳輸性能能提高5%