看到DB.pas 里面的
procedure TStringField.SetAsString(const Value: string);
begin
SetAsAnsiString(AnsiString(Value)); //这个就叫做支持unicode.......所有的unicode string 到传到了里面全变成了ansi 字符.害的我在繁体系统里读取简体unicode 文件全是乱码.纳闷.
end;
你的string是unicode没错,可是你的vcl又有多少是ansi做核心编码的???看到上面的语句真有点浪费我的时间.
本来以为是vcl代码不一致的问题导致,可是看到cpu里面的代码就确认是传进去的unicode 竟然被转成ansi 了.能不乱码.一个简体unicode在繁体系统里面能不乱吗??????哎!!默哀.
TStringField.SetAsString:
004F85A8 55 push ebp
004F85A9 8BEC mov ebp,esp
004F85AB 6A00 push $00
004F85AD 53 push ebx
004F85AE 56 push esi
004F85AF 8BF2 mov esi,edx
004F85B1 8BD8 mov ebx,eax
004F85B3 33C0 xor eax,eax
004F85B5 55 push ebp
004F85B6 68F3854F00 push $004f85f3
004F85BB 64FF30 push dword ptr fs:[eax]
004F85BE 648920 mov fs:[eax],esp
004F85C1 8D45FC lea eax,[ebp-$04]
004F85C4 8BD6 mov edx,esi
004F85C6 B900000000 mov ecx,$00000000
004F85CB E844F2F0FF call @LStrFromUStr
004F85D0 8B55FC mov edx,[ebp-$04]
004F85D3 8BC3 mov eax,ebx
004F85D5 8B08 mov ecx,[eax]
004F85D7 FF91EC000000 call dword ptr [ecx+$000000ec] //TStringField.SetAsAnsiString:
004F85DD 33C0 xor eax,eax
004F85DF 5A pop edx
004F85E0 59 pop ecx
004F85E1 59 pop ecx
004F85E2 648910 mov fs:[eax],edx
004F85E5 68FA854F00 push $004f85fa
004F85EA 8D45FC lea eax,[ebp-$04]
004F85ED E8A2E2F0FF call @LStrClr
004F85F2 C3 ret
004F85F3 E914D9F0FF jmp @HandleFinally
004F85F8 EBF0 jmp $004f85ea
004F85FA 5E pop esi
004F85FB 5B pop ebx
004F85FC 59 pop ecx
004F85FD 5D pop ebp
004F85FE C3 ret
004F85FF 90 nop
看来还是得使用TWideStringField 了