delphi – 不兼容的类型:’PAnsiChar’和’PWideChar’

@H_502_0@
参见英文答案 > What is the difference between WideChar and AnsiChar?2个
我是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作为下一步行动.

相关文章

ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:...
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂...
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (By...