您现在的位置:首页 >> 基础算法 >> 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 来源:原创
共有评论 2相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2018 版权所有 All Rights Reserved.
  • 沪ICP备05001939号