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)
?
質問する
2747 次
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
質問を編集して、対象の Delphi バージョンのタグを追加してください。
として渡し
PAnsiChar
ます。PChar はジョーカーであり、異なるデータ型を意味する場合があります。DLL のような API を使用する場合、コンパイラのセーフティ ネットは無視されます。つまり、独自の API を作成する必要があります。つまり、ジョーカーではなく、実際の型を使用する必要があります。これは、どのコンパイラ設定とバージョンがアクティブになっても変更されない型です。ただし、ポインターを渡す前に、ソース データが実際に 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 に答える