1

I'm writing a tool, which use a C-DLL. The functions of the C-DLL expect a char*, which is in UTF-8 Format. My question: Can I pass a PChar or do I have to use UTF8Encode(string)?

4

2 に答える 2

5

という名前の文字列変数を考えてみましょうs。ANSI では、DelphiPChar(s)は ANSI でエンコードされています。Unicode Delphi では、UTF-16 でエンコードされています。

sしたがって、どちらの方法でも、 UTF-8 エンコーディングに変換する必要があります。そしてPAnsiChar(...)、null で終了する C 文字列へのポインターを取得するために使用できます。

したがって、必要なコードは次のようになります。

PAnsiChar(UTF8Encode(s))
于 2013-02-15T11:11:46.253 に答える
1
  1. 質問を編集して、対象の Delphi バージョンのタグを追加してください。

  2. として渡しPAnsiCharます。PChar はジョーカーであり、異なるデータ型を意味する場合があります。DLL のような API を使用する場合、コンパイラのセーフティ ネットは無視されます。つまり、独自の API を作成する必要があります。つまり、ジョーカーではなく、実際の型を使用する必要があります。これは、どのコンパイラ設定とバージョンがアクティブになっても変更されない型です。

  3. ただし、ポインターを渡す前に、ソース データが実際に 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;
于 2013-02-15T11:10:54.400 に答える