Como pode um arquivo de texto ser convertido de ANSI para UTF-8 com Delphi 7?

votos
7

Eu escrevi um programa com Delphi 7 que busca *.srtarquivos em um disco rígido. Este programa lista o caminho e o nome desses arquivos em um memorando. Agora eu preciso converter esses arquivos de ANSI para UTF-8, mas não conseguiram.

Publicado 02/04/2009 em 19:23
fonte usuário
Em outras línguas...                            


5 respostas

votos
8

A função Utf8Encode recebe uma string WideString como parâmetro e retorna uma string UTF-8.

Amostra:

procedure ConvertANSIFileToUTF8File(AInputFileName, AOutputFileName: TFileName);
var
  Strings: TStrings;
begin
  Strings := TStringList.Create;
  try
    Strings.LoadFromFile(AInputFileName);
    Strings.Text := UTF8Encode(Strings.Text);
    Strings.SaveToFile(AOutputFileName);
  finally
    Strings.Free;
  end;
end;
Respondeu 04/07/2009 em 06:15
fonte usuário

votos
1

Dê uma olhada em GpTextStream que parece que trabalha com Delphi 7. Ele tem a capacidade de ler / gravar arquivos unicode em versões mais antigas do Delphi (embora funciona com Delphi 2009) e deve ajudar com a sua conversão.

Respondeu 06/07/2009 em 16:41
fonte usuário

votos
0

Por favor, leia a resposta completa antes de iniciar a codificação.


A resposta para a pergunta - e não é o fácil um - basicamente consistem em etapas de árvores:

  1. Você tem que determinar a página de código ANSI usado em seu computador. Você pode conseguir este objetivo, usando a função GetACP () na API do Windows. ( Importante: você tem que recuperar a página de códigos mais rapidamente possível após a recuperação de nome de arquivo, porque ele pode ser alterado pelo usuário.)
  2. Você deve converter a cadeia de ANSI para Unicode, chamando MultiByteToWideChar () API do Windows com o parâmetro CodePage correta (recuperado na etapa anterior). Após esta etapa, você tem uma string UTF-16 (praticamente um WideString) que contém a lista de nomes de arquivo.
  3. Você tem que converter a seqüência de caracteres Unicode UTF-8 usando UTF8Encode () ou a API WideCharToMultiByte () do Windows. Esta função irá retornar uma string UTF-8 que você precisava.

Contudo, esta solução irá retornar uma string UTF-8 que contém a cadeia de entrada ANSI, isso provavelmente não é a melhor maneira de resolver os seus problemas, uma vez que os nomes de arquivo já pode ser corrompido quando as funções ANSI voltou-los, para nomes de arquivos apropriados não são garantidos .


A solução adequada para o seu problema é maneiras mais complicado:

Se você quer ser certo que a sua lista de nomes de arquivo é exatamente limpo, você tem que ter certeza que não vai ser convertido para ANSI em tudo . Você pode fazer isso usando explicitamente a versão "W" do arquivo manipulação API. Neste caso - é claro - você não pode usar TFileStream e outros objetos de manipulação de arquivo ANSI, mas a API do Windows chama diretamente.

Não é que difícil, mas se você já tem um quadro complexo construído sobre, por exemplo TFileStream que poderia ser um pouco de dor no @ss. Neste caso, a melhor solução é criar um descendente TStream que usa o apropriado API.

Espero que minha resposta ajuda você ou qualquer um que tem que lidar com o mesmo problema. (Eu tive que não há muito tempo.)

Respondeu 31/07/2013 em 15:54
fonte usuário

votos
0
var
  Latin1Encoding: TEncoding;
begin
  Latin1Encoding := TEncoding.GetEncoding(28591);
  try
       MyTStringList.SaveToFile('some file.txt', Latin1Encoding);
  finally
      Latin1Encoding.Free;
  end;
end;
Respondeu 03/07/2009 em 20:25
fonte usuário

votos
-1

Pensou em ASCII?

ASCII é compatível com UTF-8. http://en.wikipedia.org/wiki/UTF-8

Respondeu 02/04/2009 em 19:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more