Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата Лександер:
Но она доступна только на Юникод-версии компилятора. Вопрос: как-бы ее приделать к АНСИ-компилятору? »
Действительно, стандартная функция вылетает с ошибкой...
В принципе этот момент можно обойти написав свою функцию. Накидал две функции ANSI<->UTF8:
читать дальше »

Код: Выделить весь код
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD;
  lpMultiByteStr: PAnsiChar; cbMultiByte: Integer;
  lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD;
  lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar;
  cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint;
    external 'WideCharToMultiByte@kernel32.dll stdcall';

function AnsiToUtf8(aStr: string): string;
// функция преобразовывает ANSI строку в UTF-8
var
  wStr: string;
begin
  try
    SetLength(wStr, MultiByteToWideChar(0, 0, aStr, -1, '', 0)*2);
    MultiByteToWideChar(0, 0, aStr, -1, wStr, Length(wStr));
    SetLength(Result, WideCharToMultiByte(65001, 0, wStr, -1, '', 0, 0, 0)-1);
    WideCharToMultiByte(65001, 0, wStr, -1, Result, Length(Result), 0, 0);
    Result := #$EF#$BB#$BF + Result;
  finally
    SetLength(wStr, 0);
  end;
end;

function Utf8ToAnsi(wStr: string): string;
// функция преобразовывает UTF-8 строку в ANSI
var
  aStr: string;
begin
  try
    while (wStr <> '') and ((wStr[1] = #$EF) or (wStr[1] = #$BB) or (wStr[1] <> #$BF)) do
      Delete(wStr, 1, 1);
    SetLength(aStr, MultiByteToWideChar(65001, 0, wStr, -1, '', 0)*2);
    MultiByteToWideChar(65001, 0, wStr, -1, aStr, Length(aStr));
    SetLength(Result, WideCharToMultiByte(0, 0, aStr, -1, '', 0, 0, 0)-1);
    WideCharToMultiByte(0, 0, aStr, -1, Result, Length(Result), 0, 0);
  finally
    SetLength(aStr, 0);
  end;
end;

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:57, 23-03-2011 | #1137