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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top