Как я могу преобразовать строку, закодированную с помощью кодовой страницы 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, проще использовать встроенную поддержку юникода.