java bytebuffer ansi string_关于delphi的utf8 字符串string转换问题

核心提示:先说一下场景:我方接受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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值