Delphi PChar UTF-8是否已编码?

Delphi PChar UTF-8是否已编码?,delphi,utf-8,character-encoding,pascal,Delphi,Utf 8,Character Encoding,Pascal,我正在写一个工具,它使用C-DLL。C-DLL的函数需要一个UTF-8格式的char*。 我的问题:我可以传递一个PChar还是必须使用UTF8Encode(字符串) 请编辑问题并添加带有目标Delphi版本的标签 将其作为PAnsiChar传递;PChar是一个笑话,可能意味着不同的数据类型。当您使用类似DLL的API时,您会忽略编译器安全网,这意味着您应该自己创建。这意味着您应该使用真正的类型,而不是小丑,这些类型无论哪个编译器设置和版本处于活动状态都不会改变 但是在传递指针之前,您应该确保

我正在写一个工具,它使用C-DLL。C-DLL的函数需要一个UTF-8格式的
char*
。 我的问题:我可以传递一个
PChar
还是必须使用
UTF8Encode(字符串)

  • 请编辑问题并添加带有目标Delphi版本的标签

  • 将其作为
    PAnsiChar
    传递;PChar是一个笑话,可能意味着不同的数据类型。当您使用类似DLL的API时,您会忽略编译器安全网,这意味着您应该自己创建。这意味着您应该使用真正的类型,而不是小丑,这些类型无论哪个编译器设置和版本处于活动状态都不会改变

  • 但是在传递指针之前,您应该确保源数据实际上是用UTF8编码的

  • 请编辑问题并添加带有目标Delphi版本的标签

  • 将其作为
    PAnsiChar
    传递;PChar是一个笑话,可能意味着不同的数据类型。当您使用类似DLL的API时,您会忽略编译器安全网,这意味着您应该自己创建。这意味着您应该使用真正的类型,而不是小丑,这些类型无论哪个编译器设置和版本处于活动状态都不会改变

  • 但是在传递指针之前,您应该确保源数据实际上是用UTF8编码的


  • 考虑一个名为
    s
    的字符串变量。在ANSI Delphi上,
    PChar(s)
    是ANSI编码的。在Unicode Delphi上,它是UTF-16编码的

    因此,无论哪种方式,您都需要将
    s
    转换为UTF-8编码。然后可以使用
    PAnsiChar(…)
    获取指向以null结尾的C字符串的指针

    因此,您需要的代码如下所示:

    PAnsiChar(UTF8Encode(s))
    

    考虑一个名为
    s
    的字符串变量。在ANSI Delphi上,
    PChar(s)
    是ANSI编码的。在Unicode Delphi上,它是UTF-16编码的

    因此,无论哪种方式,您都需要将
    s
    转换为UTF-8编码。然后可以使用
    PAnsiChar(…)
    获取指向以null结尾的C字符串的指针

    因此,您需要的代码如下所示:

    PAnsiChar(UTF8Encode(s))
    

    你应该通过一个
    PByte
    PAnsiChar
    来确保目标是UTF-8编码的。你的Delphi版本是什么?我必须用Pascal编写,它支持所有类型的Pascal(Delphi、GNU Pascal、Free Pascal)这就意味着你必须为自己制作一个表格:Delphi/FPC/GP/所有其他pascal实现的不同版本有哪些。您的程序如何检测这些版本?这些版本中存在哪些转换为UTF8的功能。然后为每个编译器/版本编写代码。您可以尝试使用绝地代码库(jcl.sf.net),但最新的FPC并没有官方支持,GP也不受支持。此外,还不支持PaxScript Pascal、Oxygen、MIDlet Pascal、Virtual Pascal等。那么标准Pascal呢,1974年指定的Pascal,其中没有UTF8,没有C,也没有DLL。我和我的儿子;我不记得有没有弦。你甚至不能用“标准帕斯卡”术语来描述你的任务。不管你喜欢与否,但是你必须列出你要支持的编译器和版本,然后要求实现每个给定的编译器/版本。“所有类型的Pascal”并不是一个真正意义上的术语。你应该通过
    PByte
    PAnsiChar
    确保目标是UTF-8编码的。你的Delphi版本是什么?我必须用Pascal编写,它支持所有类型的Pascal(Delphi、GNU Pascal、Free Pascal)这就意味着你必须为自己制作一个表格:Delphi/FPC/GP/所有其他pascal实现的不同版本有哪些。您的程序如何检测这些版本?这些版本中存在哪些转换为UTF8的功能。然后为每个编译器/版本编写代码。您可以尝试使用绝地代码库(jcl.sf.net),但最新的FPC并没有官方支持,GP也不受支持。此外,还不支持PaxScript Pascal、Oxygen、MIDlet Pascal、Virtual Pascal等。那么标准Pascal呢,1974年指定的Pascal,其中没有UTF8,没有C,也没有DLL。我和我的儿子;我不记得有没有弦。你甚至不能用“标准帕斯卡”术语来描述你的任务。不管你喜欢与否,但是你必须列出你要支持的编译器和版本,然后要求实现每个给定的编译器/版本。“所有类型的Pascal”不是一个真正意义上的术语。为什么要手动添加空终止符?现在你的字符串有两个。您可以只做
    buffer:=数据;C_DLL_调用(PAnsiChar(buffer))
    因为我想在这里实现所有自动化。我不确定指针(缓冲区)是否会确保终止符。正如AnsiString所暗示的那样,我不确定PAnsiChar(缓冲区)今天或明天不会确保转码。P***字符不是原子类型,它们承载着编译器的魔力。由于RTL中没有PUTF8Char类型,为了使代码将来兼容,我宁愿删除所有可能的意外自动化源。你能保证PAnsiChar(一些字符串)永远不会对数据类型进行转码吗?
    PAnsiChar(UTF8Encode(s))
    保证会执行所需的操作。我希望如此,但我看不到合同,PAnsiChar typecast今天和将来都不会导致另一次转码。我看到很多人被Delphi自动化系统咬了一口,他们认为根本就没有。包括那些试图在从MSXML获取数据后检测XML源字符集并应用转码的人,他们只是认为数据不能在内部进行转码,并继续应用冗余转换。除非PAnsiChar typecast被公开宣称永远不会导致任何数据转换,但会终止为零,否则它不是未来的证据吗