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

Строка кириллицы, которую получает мое приложение, использует (я полагаю) таблицу ниже:

сказал я верю, потому что все символы, которые я проверял, соответствуют этому столу.

Вопрос: Как я могу преобразовать такую ​​вещь в строку, которая по умолчанию в моем delphi unicode? Или еще лучше: есть ли готовый к использованию конвертер в Delphi или я должен написать его?

3 ответа

Если вы используете Delphi 2009 или более позднюю версию, это делается автоматически:

type
  CyrillicString = type AnsiString(1251);

procedure TForm1.FormCreate(Sender: TObject);
var
  UnicodeStr: string;
  CyrillicStr: CyrillicString;
begin
  UnicodeStr := 'This is a test.'; // Unicode string
  CyrillicStr := UnicodeStr; // ...converted to 1251

  CyrillicStr := 'This is a test.'; // Cryllic string
  UnicodeStr := CyrillicStr; // ...converted to Unicode
end;

Прежде всего, я рекомендую вам прочитать статью Марко Канту о Unicode в Delphi. Из вашего вопроса (и предыдущих вопросов) я также предполагаю, что вы используете версию Delphi для Unicode, т.е. D2009 или более позднюю.


Прежде всего, вы можете определить AnsiString с кодовой страницей 1251, чтобы соответствовать вашим входным данным.

type
  CyrillicString = type Ansistring(1251);

Это важный шаг. В нем говорится, что любые данные, содержащиеся в переменной этого типа, должны интерпретироваться как закодированные с использованием кодовой страницы 1251. Это позволяет Delphi выполнять правильные преобразования в другие типы строк, как мы увидим позже.

Затем скопируйте ваши входные данные в строку этой переменной.

function GetCyrillicString(const Input: array of Byte): CyrillicString;
begin
  SetLength(Result, Length(Input));
  if Length(Result)>0 then
    Move(Input[0], Result[1], Length(Input));
end;

Конечно, могут быть и другие, более удобные способы ввода данных. Возможно, они поступают из потока. В любом случае, убедитесь, что вы делаете это с чем-то эквивалентным копии памяти, чтобы не вызывать преобразования кодовых страниц и, таким образом, терять кодировку 1251.

Наконец, вы можете просто назначить CyrillicString на простой Unicode string переменная и среда выполнения Delphi выполняет необходимое преобразование автоматически.

function ConvertCyrillicToUnicode(const Input: array of Byte): string;
begin
  Result := GetCyrillicString(Input);
end;

Среда выполнения может выполнить это преобразование, потому что вы указали кодовую страницу при определении CyrillicString и потому что string карты для UnicodeString который кодируется с UTF-16.

Windows API MultiByteToWideChar() и WideCharToMultiByte() можно использовать для преобразования в любую поддерживаемую кодовую страницу в Windows и из нее. Конечно, если вы используете Delphi >= 2009, проще использовать встроенную поддержку юникода.

Другие вопросы по тегам