Delphi→ Функция перевода StrToUTF16

Май 11, 2011


Пол дня искал как перевести стандартную строку ANSI в UTF-16 (данный юникод еще называют UCS2). Перерыл кучу форумов, где советовали использовать MultiByteToWideChar, но как я его не крутил, он не выполнял требуемую задачу.

Пришлось немного изучить сам формат: например, слово «TEST» в кодировке UTF-16 (UCS2) в шестнадцатеричном представлении выглядит как «00 54 00 45 00 53 00 54«. Согласно спецификации UTF-16, каждый символ занимает 2 байта, именно поэтому между отдельными символами появился еще один байт — 00. Может быть немного грубое пояснение, но в моем случае данный метод работает.

Теперь осталось реализовать этот алгоритм в коде, который умещается в 3 строчки:

function UTF16(ASource: PWideChar): string;
var
  FSize : Integer;
begin
  FSize := Length(ASource) * 2;
  SetLength(Result, FSize);
  Move(ASource^, Pointer(Result)^, FSize);
end;


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

Честно говоря, этот код слегка модифицированная версия функции TUTF16BECodec.Encodeиз модуля cUnicodeCodecs.pas (библиотека Utilities Library от Delphi Fundamentals). Там же вы можете найти много интересных кодеров для различных кодировок.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *