Delphi преобразует C ++ DLL-строку с BOM в строку - PullRequest
0 голосов
/ 09 мая 2019

У меня есть строка из DLL на основе C ++, которая может включать в себя спецификацию и будет иметь нулевое окончание

Первоначально я обрабатывал ее, обрабатывая ее как массив char и приводя результат к PChar

function TRFCNWParameter.GetAsString: string;
const
  DEFAULT_BUFFER_SIZE = 1024;
var
  ResultSize: cardinal;
  Buffer: TArray<Char>;
  lErrorInfo: RRFCNWErrorInfo;
  RC: TRfcReturnCode;
begin
 SetLength(Buffer, DEFAULT_BUFFER_SIZE);

 RC := RFCGetString(OwnerHandle, PChar(ParamName), @Buffer[0], Length(Buffer), ResultSize, @lErrorInfo);
 if (RC <> RFC_OK) and (ResultSize >= Length(Buffer)) then
 begin
   // resize buffer and retry
   SetLength(Buffer, ResultSize + 1);
   RC := RFCGetString(OwnerHandle, PChar(ParamName), @Buffer[0], Length(Buffer), ResultSize, @lErrorInfo);
 end;

 CheckForReturnedError(@lErrorInfo, 'Retrieve Parameter %s ' + ParamName);

 result := PChar(Buffer);
end;

Теперь я не слишком знаком с тем, как отображаются строки Юникода в отладчике, но я замечаю, что когда я оцениваю результирующую строку, я вижу BOM

, поэтому обычный Delphiисходная строка будет отображаться в одинарных кавычках: 'test string' Строки из этой подпрограммы могут отображаться в отладчике как #FEFF'test string'

, она появляется вне одинарных кавычек, что заставляет меня сомневаться в том, что Delphi по своей природе обрабатывает ее.

Поскольку у меня возникают проблемы с анализом вывода как XML, я сомневаюсь, что это так.Поэтому я пытаюсь сделать преобразование в нативный UTF-16

function TRFCNWParameter.GetAsString: string;
const
  DEFAULT_BUFFER_SIZE = 1024;
var
  ResultSize: cardinal;
  Buffer: TBytes;
  bufferCharLength: cardinal;
  lErrorInfo: RRFCNWErrorInfo;
  RC: TRfcReturnCode;
  char_size: cardinal;
begin
 char_size := 2;
 bufferCharLength := DEFAULT_BUFFER_SIZE;
 SetLength(Buffer, DEFAULT_BUFFER_SIZE * char_size);

 RC := RFCGetString(OwnerHandle, PChar(ParamName), @Buffer[0], bufferCharLength, ResultSize, @lErrorInfo);
 if (RC <> RFC_OK) and (ResultSize >= Length(Buffer)) then
 begin
   // resize buffer and retry
   bufferCharLength := (ResultSize + 1);
   SetLength(Buffer, bufferCharLength * CHAR_SIZE);
   RC := RFCGetString(OwnerHandle, PChar(ParamName), @Buffer[0], bufferCharLength, ResultSize, @lErrorInfo);
 end;

 CheckForReturnedError(@lErrorInfo, 'Retrieve Parameter %s ' + ParamName);
 result := TEncoding.Unicode.GetString(buffer); // needed to handle little-endian and BOM
end;

Это, однако, не завершает строку нулем, оставляя меня с нагрузкой 0 в конце.Я думаю, что могу привести к PChar, а затем вернуть обратно, result := PChar(TEncoding.Unicode.GetString(buffer));, но это выглядит немного уродливо и заставляет меня задуматься, делаю ли я это немного неправильно (или мне даже нужно что-то делать, поскольку IDE обрабатывает спецификациюправильно)?

...