您現在的位置:首頁 >> 基礎算法 >> window基礎 >> 內容

關于delphi的utf8 字符串string轉換問題

時間:2018/6/12 11:56:41 點擊:

  核心提示:先說一下場景:我方接受java傳過來的webservice,里面的字符是utf8編碼的,然后 某些漢字總是轉換錯誤?比如 監護人2580,轉換后就出現 監護人?580, 對方說 其他語言都沒有問題。于是跟蹤,還好寫入文件的字節流,被utraedit識別為沒有bom的utf8編碼,可以顯示,看來是我這...

先說一下場景:我方接受java傳過來的webservice,里面的字符是utf8編碼的,然后 某些漢字總是轉換錯誤?

比如  監護人2580,轉換后就出現  監護人?580, 對方說 其他語言都沒有問題。于是跟蹤,還好寫入文件的字節流,被

utraedit識別為沒有bom的utf8編碼,可以顯示,看來是我這邊的問題。

我這邊用了diocp  的 ContentAsString 接收字符串 ,最終調試用的是ByteBufferToString 轉換成字符串處理

 

function ByteBufferToString(pvBuff:PByte; pvLen:Cardinal): string;

{$IFNDEF UNICODE}

var

  lvRawStr:AnsiString;

  l:Cardinal;

{$ELSE}

var

  lvBytes:TBytes;

    lvRawStr:AnsiString;

  l:Cardinal;

{$ENDIF}

begin

{$IFDEF UNICODE}

  

  SetLength(lvBytes, pvLen);

  Move(pvBuff^, lvBytes[0], pvLen);

  Result := TEncoding.Default.GetString(lvBytes);

 

{$ELSE}

  l := pvLen;

  SetLength(lvRawStr, l);

  Move(pvBuff^, PansiChar(lvRawStr)^, l);

  Result := lvRawStr;

{$ENDIF}

end;

  

剛開始總以為是delphi的utf8decode寫的有問題,然后用TEncoding,還是不行

跟蹤 監護人的字節 :正確的是 E7 9B 91 E6 8A A4 E4 BA BA 32 35 38 30

但是我們的人,少了個BA,改為3F了?

E7 9B 91 E6 8A A4 E4 BA 3F 35 38 30

究竟是什么神手,可以改變,后來沒有辦法自己寫了個函數一樣的

function ByteBufferToAnsiString(pvBuff:PByte; pvLen:Cardinal): ansistring;

 var

  lvRawStr:AnsiString;

  l:Cardinal;

  begin

     l := pvLen;

    SetLength(lvRawStr, l);

    Move(pvBuff^, PansiChar(lvRawStr)^, l);

    Result := lvRawStr;

 

  end;

 

居然發現可以正確傳輸自己了。

哦,my god,原來是  我們的delphi的結果是string類型,不是ansistring類型,于是在編譯器里面ansistring內部做了轉換.  

這個好像是為什么有些大神不用string的原因,如果string長度很大,那做轉換豈不是要很多時間,所以建議delphi粉絲們,新版的delphi最好用tbytes這樣的類型,老版d7黨,可以用ansistring

 

 

 

 

作者:142857 錄入:142857 來源:原創
共有評論 4相關評論
發表我的評論
  • 大名:
  • 內容:
  • 盒子文章(www.srtxuk.icu) © 2019 版權所有 All Rights Reserved.
  • 滬ICP備05001939號
  • 快乐10分助手官网