是PChar UTF-8编码的吗?

时间:2013-02-15 10:33:12

标签: delphi utf-8 character-encoding pascal

我正在编写一个使用C-DLL的工具。 C-DLL的功能期望char*,其为UTF-8格式。 我的问题:我可以通过PChar还是必须使用UTF8Encode(string)

2 个答案:

答案 0 :(得分:5)

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

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

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

PAnsiChar(UTF8Encode(s))

答案 1 :(得分:1)

  1. 请编辑问题并添加目标Delphi版本的标签。

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

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

  4. 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;