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). Там же вы можете найти много интересных кодеров для различных кодировок.