Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Преобразование части массива байтов в строку с использованием TEncoding.UTF8.GetString

Delphi , Синтаксис , Кодировки

Преобразование части массива байтов в строку с использованием TEncoding.UTF8.GetString

Вопрос пользователя связан с необходимостью преобразования части статического массива байтов в строку, используя метод TEncoding.UTF8.GetString. При этом нежелательно выполнять копирование содержимого массива в динамический массив, так как это может быть неэффективно. Пользователь столкнулся с проблемой, что стандартный синтаксис не работает для статических массивов, и предложенные им варианты решения также не увенчались успехом.

Альтернативное решение

В качестве альтернативного решения можно использовать функцию System.UnicodeFromLocaleChars, которая обёртывает MultiByteToWideChar в Windows и UnicodeFromLocaleChars в POSIX системах. Вот пример функции, которая выполняет преобразование байтов UTF-8 в строку:

uses
  SysUtils, SysConst, Windows;

function Utf8BytesToString(Bytes: PByte; ByteCount: Integer): string;
var
  Len: Integer;
begin
  Len := UnicodeFromLocaleChars(CP_UTF8, MB_ERR_INVALID_CHARS, Pointer(Bytes),
    ByteCount, nil, 0);
  if (ByteCount > 0) and (Len = 0) then begin
    raise EEncodingError.CreateRes(@SNoMappingForUnicodeCharacter);
  end;
  SetLength(Result, Len);
  UnicodeFromLocaleChars(CP_UTF8, MB_ERR_INVALID_CHARS, Pointer(Bytes),
    ByteCount, Pointer(Result), Len);
end;

Подтвержденное решение

Также можно использовать защищённые перегрузки TEncoding.GetCharCount и TEncoding.GetChars, которые поддерживают работу с указателями на байты. Ниже приведён пример класса-помощника, который позволяет выполнить преобразование:

type
  TEncodingHelper = class helper for TEncoding
  public
    function GetString(Bytes: PByte; ByteCount: Integer): String;
  end;

function TEncodingHelper.GetString(Bytes: PByte; ByteCount: Integer): String;
begin
  SetLength(Result, Self.GetCharCount(Bytes, ByteCount));
  Self.GetChars(Bytes, ByteCount, PChar(Result), Length(Result));
end;

var
  S: string;
begin
  S := TEncoding.UTF8.GetString(PByte(@arr[index]), ByteCount);
end;

Обратите внимание, что данный подход доступен начиная с версии RAD Studio XE.

Заключение

При работе с частичным содержимым статического массива байтов в Delphi для его преобразования в строку можно использовать функцию System.UnicodeFromLocaleChars или создать собственный класс-помощник для TEncoding, который позволит работать с указателями на байты. Это позволяет избежать лишнего копирования данных и повышает эффективность работы с массивами.

Создано по материалам из источника по ссылке.

Описание контекста: Вопрос связан с преобразованием части статического массива байтов в строку с использованием UTF-8 кодировки в среде разработки Delphi, с учетом избегания копирования данных для повышения эффективности.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Кодировки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:56:44/0.0056679248809814/1