Delphi 2010: как конвертировать PAnsiChar в кодировке UTF8 в UnicodeString?

Ситуация: у меня есть внешняя DLL, которая использует UTF-8 в качестве внутреннего формата строки. Все функции интерфейса используют PAnsiChar для передачи строк.

Остальная часть моего приложения использует родной Delphi string тип; так как я работаю с Delphi 2010, это будет отображаться на UnicodeString,

Как я могу надежно привести эти аргументы PAnsiChar (которые указывают на строки в кодировке UTF-8) в UnicodeString?

У меня была эта функция, которая, я думал, работала нормально:

function PUTF8CharToString(Text: PAnsiChar): string;
var
  UText: UTF8String;
begin
  UText := UTF8String(Text);
  Result := string(UText);
end;

... но теперь я столкнулся с случаем, когда строка результата повреждена; когда я сохраняю PAnsiChar в файл, все нормально; но когда я сохраняю полученную строку после преобразования, используя вышеуказанную функцию, она повреждена.

Или это должно работать правильно, и свидетельствует ли это о какой-то другой проблеме выделения памяти?


Редактировать: мне наконец удалось избавиться от повреждения памяти, назначив преобразованную строку в строку локальной переменной, вместо прямой передачи ее другой функции.

2 ответа

Решение

Из системы:

function UTF8ToUnicodeString (const S: PAnsiChar): UnicodeString; перегрузки;


UnicodeStr: = System.Utf8ToUnicodeString (Text);

Попробуйте использовать SetString() вместо приведения:

function PUTF8CharToString(Text: PAnsiChar): string;
var
  UText: UTF8String;
begin
  SetString(UText, Text, StrLen(Text));
  Result := UText;
end;
Другие вопросы по тегам