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

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

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

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

Ответы [ 3 ]

7 голосов
/ 28 августа 2011

Если вы используете 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;
4 голосов
/ 28 августа 2011

Прежде всего, я рекомендую вам прочитать Технический документ Марко Канто по 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.

1 голос
/ 29 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...