MS Word Ole Automation, caractères ADO et étrangers
-
06-09-2019 - |
Question
Je suis en train d'exporter WideString textes de la base de données (ADO / MS Access) au document MS Word (Delphi 7), mais les caractères étrangers ne sont pas correctement transférés (ie " è " au lieu de " c "):
while not ADOQuery1.Eof do
begin
WordApplication1.Selection.TypeText(ADOQuery1Text.AsVariant); // TWideStringField
WordApplication1.Selection.TypeParagraph;
ADOQuery1.Next;
end;
J'ai aussi essayé d'utiliser directement CreateOleObject()
, mais pas de différence.
Qu'est-ce que je suis absent?
Merci!
La solution
Je pense que ce n'est pas un problème avec Word, mais plutôt de la façon dont les chaînes sont stockées dans la base de données. Ils sont probablement enregistrés en tant que chaînes Ansi, et non comme des chaînes Unicode / WideString. Et si cela est vrai, alors ils sont enregistrés dans un codage que vous devez savoir si vous voulez qu'ils soient décodés correctement.
Voici un exemple d'application montrant comment convertir la chaîne en Ansi WideString et enregistrez dans 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.
Le code ci-dessus utilise l'unité freeware CodecUtilsWin32.pas de Utility Library v.2.0.18
Je suggère d'utiliser TStringField au lieu de TWideStringField et convertir les chaînes à WideStrings comme dans l'exemple ci-dessus.
Autres conseils
Avez-vous essayé d'utiliser
WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString);
Court de cela, je sais que Delphi 2009 a une meilleure gestion de l'Unicode (ensemble VCL supporte désormais directement) qui serait très probablement corriger votre problème.