MS Word Ole Automation, ADO и иностранные символы
Я пытаюсь экспортировать тексты WideString из базы данных (ADO / MS Access) в документ MS Word (Delphi 7), но посторонние символы передаются неправильно (например, "è" вместо "č"):
while not ADOQuery1.Eof do
begin
WordApplication1.Selection.TypeText(ADOQuery1Text.AsVariant); // TWideStringField
WordApplication1.Selection.TypeParagraph;
ADOQuery1.Next;
end;
Я также пытался использовать CreateOleObject()
напрямую, но без разницы.
Что мне не хватает?
Спасибо!
2 ответа
Я думаю, что это не проблема с Word, а скорее с тем, как строки хранятся в базе данных. Они, вероятно, сохраняются как строки Ansi, а не как строки Unicode / WideString. И если это так, то они сохраняются в некоторой кодировке, которую вы должны знать, если хотите, чтобы они были правильно декодированы.
Вот пример приложения, демонстрирующего, как преобразовать строку Ansi в WideString и сохранить ее в Word:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
ComObj,
ActiveX,
CodecUtilsWin32;
procedure Test();
var
wordApp, wordDoc: Variant;
ansiStr: string;
codec: TUnicodeCodec;
function str2WideStr(const s: string): WideString;
var
i: Integer;
begin
codec.DecodeStr(@s[1], Length(s), Result);
end;
begin
codec := TEncodingRepository.CreateCodecByAlias('ISO-8859-2');
ansiStr := #$BF#$F3#$B3#$E6; //"zólc"
wordApp := CreateOleObject('Word.Application');
wordDoc := wordApp.Documents.Add;
wordApp.Selection.TypeText(str2WideStr(ansiStr));
wordDoc.SaveAs('C:\sample.doc');
wordDoc.Close();
wordApp.Quit(False);
end;
begin
CoInitialize(nil);
Test();
end.
Приведенный выше код использует бесплатный модуль CodecUtilsWin32.pas из библиотеки утилит v.2.0.18.
Поэтому я бы предложил использовать TStringField вместо TWideStringField и преобразовать строки в WideString s, как в примере выше.
Вы пытались использовать
WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString);
Если не считать этого, я знаю, что Delphi 2009 лучше обрабатывает Unicode (теперь весь VCL поддерживает его напрямую), что, скорее всего, решит вашу проблему.