{ 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;
const
cUTF8 = $BFBBEF; var
W_TXT: UTF8String;
fs: TFileStream;
wBOM: Integer; begin if TRIM(P_ARQUIVO_MEMO.Text) <> '' thenbegin //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;