Buscar

Grava arquivo formatado utf-8 nota paulista

Código

{ Procedure para gravar B.O.M. no arquivo TXT, para identificação
  de UTF-8.
  Obervar que é necessário utilizar a função Utf8Encode() para garantir
  que o TXT está escrito no padrão UTF.
  São duas coisas diferentes: ter o TXT codificado UTF ( que a função Utf8Encode()
  faz ), e gravá-lo informando que é UTF para outros programas que irão
  ler este arquivo e reconhecer como utf-8.

  Autor: Jorge J. Maurer - São Paulo/SP, 06/01/2008
  Fonte de Pesquisa: Internet http://www.geocities.com/pmpg98_pt/CharacterEncoding.html

  "Próspero é quem faz os outros prosperarem". Henry Ford
}

unit Fgrava_utf8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls;

type
  TF_GRAVA_UTF8 = class(TForm)
    Memo1: TMemo;
    SpeedButton1: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_GRAVA_UTF8: TF_GRAVA_UTF8;

implementation


Procedure SalvaComoUTF8( const P_PATH_E_NOME_ARQUIVO:String; P_ARQUIVO_MEMO: TStrings );

const
  cUTF8 = $BFBBEF;
var
  W_TXT: UTF8String;
  fs: TFileStream;
  wBOM: Integer;
begin
  if TRIM(P_ARQUIVO_MEMO.Text) <> '' then begin
    //se o arquivo estiver vazio, iria gerar uma excessão !!!
    W_TXT:= P_ARQUIVO_MEMO.Text;
    fs:= Tfilestream.create( P_PATH_E_NOME_ARQUIVO, fmCreate );
    try
      wBOM := cUTF8;
      //aqui está o "segredo"...
      //inserir o B.O.M. no início do arquivo, antes do texto.
      fs.WriteBUffer( wBOM, sizeof(wBOM)-1);
      //aqui, grava o texto que nos interessa...
      fs.WriteBuffer( W_TXT[1], Length(W_TXT)*Sizeof( W_TXT[1] ));
    finally
      fs.free
    end;
  end;
end;

{$R *.dfm}



procedure TF_GRAVA_UTF8.SpeedButton1Click(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.Add(Utf8Encode('Arquivo teste txt'));
  Memo1.Lines.Add(Utf8Encode('para gravação (observem a acentuação no arq txt)'));
  Memo1.Lines.Add(Utf8Encode('no formato UTF-8'));
  Memo1.Lines.Add(Utf8Encode('com caracteres de controle "B.O.M."'));
  Memo1.Lines.Add(Utf8Encode('"B.O.M." = Byte Order Mark'));
 
  SalvaComoUTF8('C:TESTE_UTF8.TXT',Memo1.Lines);

  { após a chamada da procedure, abra o arquivo com o NOTEPAD,
    acesse o menu -> Salvar Como e verifique o tipo do arquivo,
    que deverá estar como UTF-8 no box. Isso indica que ele
    foi gerado corretamente como a NF Paulista requer. }

end;

end.

 

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Arquivos
Adicionada dia: 07/01/08
Por: Jorge Joel
Visualizada: 16382 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009