如何将UTF-8字符串从Delphi传递到DLL C外部函数?

如何将UTF-8字符串从Delphi传递到DLL C外部函数?,c,string,delphi,utf-8,C,String,Delphi,Utf 8,我正在从Delphi调用Visual Studio编译的DLL中的C外部函数。DLL方法又调用C++方法,它以C++字符串类型作为参数。Delphi端的字符串是UTF-8编码的(没有BOM)。我需要确保采用字符串类型的C++方法得到UTF-8编码字符串。 我可以修改DLL源代码。我的问题: 我在Delphi端的UTF-8字符串是字符串类型。C extern方法应该采用什么类型?PChar,PWideChar?我如何将它转换为C++字符串类型?< /p> 注意:我不能首先将UTF-8字符串转换为A

我正在从Delphi调用Visual Studio编译的DLL中的C外部函数。DLL方法又调用C++方法,它以C++字符串类型作为参数。Delphi端的字符串是UTF-8编码的(没有BOM)。我需要确保采用字符串类型的C++方法得到UTF-8编码字符串。 我可以修改DLL源代码。我的问题:

我在Delphi端的UTF-8字符串是字符串类型。C extern方法应该采用什么类型?PChar,PWideChar?我如何将它转换为C++字符串类型?< /p> 注意:我不能首先将UTF-8字符串转换为AnsiString,因为编码存储了一些必须保留的希腊字母。C++端将复制Delphi字符串,并处理分配的内存。 Delphi端(使用XE6):

C++结束(使用VS 2013):


在Delphi端,参数是
PAnsiChar
,您可以这样传递:
PAnsiChar(Utf8String(str))

在C++侧,您接收的参数为“代码> const char */COD>”。p>
显然,您需要确保调用约定匹配

另一个选项是使用
UTF8String
类型:

mystr : string;
u8: UTF8String;

u8 := UTF8String(mystr);
callCExternMethod(PAnsiChar(u8));
注意:
UTF8String
类型在Delphi XE5到10.0西雅图的移动平台上不可用,除非您使用补丁启用它:


UTF8String
已在Delphi 10.1 Berlin中重新启用,用于移动启动。

这个问题肯定已经被问了100次了。。。。。你试过谷歌搜索吗?每次调用使用文本的Windows函数时,您都在做这件事。在Delphi端的PAnsiChar。C++的边上的const char。在通过调用函数之前,需要将其编码为以null结尾的utf8 strong。RTL具有这方面的功能。尝试搜索。必读:您正在寻找Utf8Encode Oh,并确保调用约定正确。它需要是
cdecl
stdcall
(可能是前者),这样就行了。谢谢你的回答。知道了答案,我现在可以看到有类似的反应,例如由于某种原因没有出现在我的搜索。我很抱歉不必要地占用了响应者的时间。在Delphi 2009+中,不推荐使用
UTF8Encode()
,请使用
UTF8String
代替:
PAnsiChar(UTF8String(str))
,或者只需将
str
声明为
UTF8String
,然后按原样键入cast:
PAnsiChar(str)
@RemyLebeau UTF8String在“nex gen”Delphi中被禁止用于LLVM@Arioch'该名称:。如果你不想依赖
UTF8String
,那么你可以使用
TEncoding.UTF8.GetBytes()
。@RemyLebeau所以他们最终决定停止pi。。随风吐痰?我很惊讶:-)您需要显式类型转换来避免“W1057隐式字符串从'string'转换为'UTF8String'”警告:
u8:=UTF8String(mystr)就个人而言,我最好禁用该特定警告。在显式类型转换的情况下,虽然不需要临时变量,但我不会禁用警告。隐式字符串强制转换可能会修改数据,这就是为什么会出现警告的原因。显式强制转换告诉编译器您理解并接受风险。警告发生在将一个字符串类型隐式赋值给另一个字符串类型时。如果目标字符串类型是Ansi字符串,则会得到一个稍有不同的警告:
W1058隐式字符串转换,可能会将数据从“string”丢失到“AnsiString”
void callCExternMethod (????? mystr) {

  // convert mystr to C++ string type

  callCPlusPlusMethod (takes C++ string type)
}
mystr : string;
u8: UTF8String;

u8 := UTF8String(mystr);
callCExternMethod(PAnsiChar(u8));