문제

데이터베이스 (ADO / MS 액세스)에서 MS Word 문서 (DELPHI 7)로 광범위한 텍스트를 내보내려고하지만 외국 문자가 올바르게 전송되지는 않습니다 (즉.è" 대신에 "č"):

while not ADOQuery1.Eof do
begin
  WordApplication1.Selection.TypeText(ADOQuery1Text.AsVariant); // TWideStringField
  WordApplication1.Selection.TypeParagraph;
  ADOQuery1.Next;
end;

나는 또한 사용하려고 노력했다 CreateOleObject() 직접적이지만 차이는 없습니다.

내가 무엇을 놓치고 있습니까?

감사!

도움이 되었습니까?

해결책

나는 그것이 단어에 문제가 아니라 문자열이 데이터베이스에 저장되는 방식에 문제가된다고 생각합니다. 그들은 아마도 유니 코드/넓은 문자열이 아니라 ANSI 줄로 저장 될 수 있습니다. 그리고 그것이 사실이라면, 그들은 당신이 그들이 올바르게 디코딩되기를 원하는지 알아야하는 인코딩에 저장됩니다.

다음은 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 From을 사용합니다 유틸리티 라이브러리 v.2.0.18

따라서 Twidestringfield 대신 TStringfield를 사용하고 위의 예에서와 같이 문자열을 Widestrings로 변환하는 것이 좋습니다.

다른 팁

사용해 보셨습니까?

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

그 결과, Delphi 2009가 유니 코드를 더 잘 처리하고 (전체 VCL이 직접 지원) 문제를 해결할 가능성이 높다는 것을 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top