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

Я уже не раз писал, как сейчас трудно найти работу толковому Delphi-программисту. В Самаре очень мало компаний, использующих в своих продуктах этот язык программирования. А те кто его используют, давно уже собрали штат необходимых сотрудников. Тем не менее, не нужно терять надежду, возможно есть вакансии в Рязани или других городах. Переезд в другой город не должен вас смущать, так как зарплата у программиста всегда щедрая.

Post to Twitter

Похожие статьи:

  1. Функции кодирования Base64

Комментарии (3)

  1. avatar

    Анонимус
    Август 1st, 2011 at 02:50 #

    А присвоение АНСИСтринга ВайдСтрингу больше не работает?

  2. avatar

    GlooK
    Август 1st, 2011 at 10:03 #

    Нет. В моем случае это не помогло.

  3. avatar

    xpert13
    Июнь 22nd, 2012 at 14:49 #

    Вот такой код у меня работает:
    myUnicodeString := string(myAnsiString);

Ваш комментарий

Rambler's Top100 Яндекс.Метрика