参见英文答案 >
What is the difference between WideChar and AnsiChar?2个
我是delphi XE8的新手.我有以下代码来自我的delphi版本6,我想在delphi XE8中运行它.
我是delphi XE8的新手.我有以下代码来自我的delphi版本6,我想在delphi XE8中运行它.
1. function UTF8ToStringLen(const src: PChar; const Len: Cardinal): widestring; 2. var 3. l: Integer; 4. begin 5. SetLength(Result,Len); 6. if Len > 0 then 7. begin 8. l := MultiByteToWideChar( CP_UTF8,src,Len,PWChar(Result),Len*SizeOf(WideChar)); <--error 9. SetLength(Result,l); 10. end; 11. end; 12. 13. 14. function StringToUTF8Len(const src: PChar; const Len: Cardinal): string; 15. var 16. bsiz: Integer; 17. Temp: string; 18. begin 19. bsiz := Len * 3; 20. SetLength(Temp,bsiz); 21. if bsiz > 0 then 22. begin 23. StringToWideChar(src,PWideChar(Temp),bsiz); 24. SetLength(Result,bsiz); 25. bsiz := WideCharToMultiByte(CP_UTF8,-1,PChar(Result),bsiz,nil,nil); <--error 26. if bsiz > 0 then dec(bsiz); 27. SetLength(Result,bsiz); 28. end; 29. end;
当我尝试运行它时,错误指向代码中的第8行和第25行,并显示错误消息
ERROR MESSAGE: Incompatible types: 'PAnsiChar' and 'PWideChar'
解决方法
在Delphi 2007及更早版本中,PChar是PAnsiChar的别名.在Delphi 2009及更高版本中,PChar是PWideChar的别名.因此,通过更改编译器,您可以更改代码的含义.
您可以通过将PAhar替换为PAnsiChar来解决此问题,并且代码将具有其原始含义.
在现代Unicode Delphi中,使用string(UnicodeString的别名)而不是COM WideString更自然.您还可以使用许多库例程中的一个来执行UTF-8转换.
肯定会有其他问题在您面前.我建议您阅读Marco Cantù’s whitepaper on Unicode in Delphi作为下一步行动.