У меня есть строка из 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 обрабатывает спецификациюправильно)?