socket傳輸漢字截斷為亂碼問題的解決 .

來源:互聯網
上載者:User

   這幾天遇到的比較麻煩的問題,用delphi的socket控制項傳輸資料,伺服器端是java發送,用戶端是delphi接收,資料量也比較大,其中有字元、漢字、數字,大部分情況下接收到的資料顯示正常,但有時會出現亂碼,經過觀察發現,由於資料包大小的限制,發送的資料有可能把漢字截斷,只發送第一個位元組過來,而第二個位元組在下一批包裡發送。這樣,接收的第一個包裡的資料進行解析時,不能正確識別最後的位元組,出現‘?’和黑方塊。接收到的第二個包裡解析的字串頭幾個字元也是亂碼:因為把截斷漢字的第二個位元組與後面的位元組拼湊了。經過多方查閱與實驗,終於搞定。

       為了更清晰的說明,先定義幾個變數:vLen:接收字串的長度;bufByte[1..2]儲存拆開位元組的資料;reStr:接收的字串;addStr:string存放拼湊的漢字;

       思路:首先判斷接收包的最後一個位元組是不是漢字的位元組,函數為:ByteType(string;integer),傳回值為mbSingleByte:為單位元組——數字或字元;mbLeadByte:漢字的第一個位元組;mbTrialByte:漢字的第二個位元組。我們要用的就是判斷最後一個位元組是否為mbTrialByte,如果是,恭喜:漢字被截斷了!然後用一個Byte[1]儲存這個位元組,bufByte[1]=Byte(reStr[vlen]);然後reStr:=Copy(reStr,1,vlen-1)。再取下一個包的第一個位元組,此時reStr已經是第二批接收的字串了。把它存在bufByte[2]中,bufByte[2]:=Byte(reStr[1]),然後將兩個位元組拼湊起來轉換為漢字:setString(addStr,pchar(@bufByte[1],2)。把addStr加到reStr的前面,reStr:=addStr+Copy(reStr,2,vlen)。如此迴圈,這樣,就可以把因為截斷造成的亂碼漢字組合進第二批字串裡正常顯示了。 

       一點小知識:傳輸中,一個漢字為兩個位元組,字元和數字都為一個位元組,漢字的兩個位元組的大小都大於0xa0(十進位160)。亂碼中除了不正常顯示的符號外,不認識的字元也是漢字的,不要以為那就是亂碼,只是不常見漢字而已,這種情況下判斷單雙位元組決定是否為漢字是有問題的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.