我正在编写一个使用C-DLL的工具。 C-DLL的功能期望char*
,其为UTF-8格式。
我的问题:我可以通过PChar
还是必须使用UTF8Encode(string)
?
答案 0 :(得分:5)
考虑一个名为s
的字符串变量。在ANSI Delphi上PChar(s)
是ANSI编码的。在Unicode Delphi上,它是UTF-16编码的。
因此,无论哪种方式,您都需要将s
转换为UTF-8编码。然后,您可以使用PAnsiChar(...)
获取指向空终止C字符串的指针。
因此,您需要的代码如下所示:
PAnsiChar(UTF8Encode(s))
答案 1 :(得分:1)
请编辑问题并添加目标Delphi版本的标签。
将其传递为PAnsiChar
; PChar是一个小丑,可能意味着不同的数据类型。当您使用类似DLL的API时,您会忽略编译器安全网,这意味着您应该自己创建。这意味着你应该使用真正的类型,而不是jokers,无论哪个编译器设置和版本都是活动的,这些类型都不会改变。
但在传递指针之前,您应该确保源数据实际上是以UTF8编码的。
Var data: string; buffer: UTF8String; buffer_ptr: PAnsiChar;
Begin
buffer := data + #0;
// transcoding to UTF8 from whatever charset it was, transparently done by Delphi RTL
// last zero to ensure that even for empty string you would have valid pointer below
buffer_ptr := Pointer(@buffer[1]); // making sure there can be no codepage bound to the datatype
C_DLL_CALL(buffeR_ptr);
End;