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