преобразование строки из некоторой кодовой страницы в Unicode

Я хотел бы преобразовать строку CP-1253 в Unicode, а также выполнить обратное преобразование.

Предположим, у меня есть две переменные, содержащие строки: MySource1253 и MyUnicodeTarget.

  1. Я предполагаю, что AnsiString подходит для MySource1253, а String должен подходить для MyUnicodeTarget, пожалуйста, поправьте меня, если я ошибаюсь.

  2. Есть ли в Delphi XE какая-то функция для преобразования одного в другое и наоборот?


person KwstasP    schedule 03.12.2016    source источник
comment
Какую кодировку Unicode вы хотите использовать. В каком виде у вас данные.   -  person David Heffernan    schedule 03.12.2016


Ответы (2)


Заявить:

type
  GreekString = type Ansistring(1253);

И для преобразования между ними просто используйте следующий код:

var
  UnicodeStr: string;
  GreekStr: GreekString;
begin
  UnicodeStr := 'This is a test.'; // Unicode string
  GreekStr := GreekString(UnicodeStr); // ...converted to 1253

  GreekStr := 'This is a test.'; // Greek string
  UnicodeStr := string(GreekStr); // ...converted to Unicode
end;

См. также: Как преобразовать строку, закодированную с помощью кодовой страницы Windows 1251, в строку Unicode.

person LU RD    schedule 03.12.2016
comment
При выполнении преобразований вы должны использовать явное приведение типов, чтобы избежать предупреждений о неявном приведении от компилятора. Преобразования Unicode‹-›Ansi потенциально связаны с потерями, поэтому вы должны сообщить компилятору, что понимаете и принимаете этот риск. Кроме того, в RTL также есть функции LocaleCharsFromUnicode() и UnicodeFromLocaleChars(), которые работают с символьными буферами вместо строк. - person Remy Lebeau; 03.12.2016

Просто вызовите RawByteStringToUnicodeString и передайте AnsiString в качестве первого аргумента и кодовую страницу (1253) в качестве второго аргумента.

MyUnicodeString := RawByteStringToUnicodeString(MyAnsiString, 1253);

Вот функции для преобразования из AnsiString(RawByteString) в Unicode и обратно. Это безопасные оболочки для Win32 MultiByteToWideChar/WideCharToMultiByte.

uses
  Windows, Math;


function RawByteStringToUnicodeString(const S: RawByteString; CP: Integer): UnicodeString;
var
  P: PAnsiChar;
  pw: PWideChar;
  I, J: Integer;
begin
  Result := '';
  if S = '' then
    Exit;
  if CP = CP_UTF8 then
  begin
    // UTF8
    Result := UTF8ToUnicodeString(S);
    Exit;
  end;
  P := @S[1];
  I := MultiByteToWideChar(CP, 0, P, Length(S), nil, 0);
  if I <= 0 then
    Exit;
  SetLength(Result, I);
  pw := @Result[1];
  J := MultiByteToWideChar(CP, 0, P, Length(S), pw, I);
  if I <> J then
    SetLength(Result, Min(I, J));
end;


function UnicodeStringToRawByteString(const w: UnicodeString; CP: Integer): RawByteString;
var
  P: PWideChar;
  I, J: Integer;
begin
  Result := '';
  if w = '' then
    Exit;
  case CP of
    CP_UTF8:
      begin
        // UTF8
        Result := UTF8Encode(w);
        Exit;
      end;
    CP_UNICODE_LE:
      begin
        // Unicode codepage
        CP := CP_ACP;
      end;
  end;

  P := @w[1];
  I := WideCharToMultibyte(CP, 0, P, Length(w), nil, 0, nil, nil);
  if I <= 0 then
    Exit;
  SetLength(Result, I);
  J := WideCharToMultibyte(CP, 0, P, Length(w), @Result[1], I, nil, nil);
  if I <> J then
    SetLength(Result, Min(I, J));
  SetCodePage(Result, CP, False);
end;
person Maxim Masiutin    schedule 04.12.2016