Ошибка кодирования в Delphi 2010 - PullRequest
4 голосов
/ 02 ноября 2009

Я тестирую Delphi 2010, и у меня была следующая ошибка:
Должен ли я войти с этой цепочкой символов "096 - Construção Ltda" и переместить ее / ее только для другой переменной и посмотреть на него / нее, что оставляет "096 - Construção Ltda", кто-нибудь знает, как выяснить что это ???

Входная база

001 Alcides João Pereira
002 Alvir Maçaneiro
003 Auto Elétrica Imamura Ltda
004 Auto Peças Araújo
005 Auto Peças Porto Eixo Ltda
006 Auto Peças União
007 Azambuja Industria Comercio de Materiais de Construção Ltda
008 Balaroti Comercio De Materiais De Construção Ltda
009 Baldissera Logística e Transportes Ltda Me
010 Battistella Veículos Pesados ​​Ltda
011 Berton Diesel Auto Peças
012 Bisolo Materiais de Construção Ltda

procedure TForm1.Button2Click(Sender: TObject);
var
   tfEntrada : TextFile;
   intI, intJ : Integer;
   strA, strS : String;

   procedure lerUm; //To read a registration of the file text
   begin
      inc( intI );
      ReadLn( tfEntrada, strS );

      strA := Copy( IntToStr( intI + 1000 ), 2, 3 ) + ' - ';
      Edit1.Text := strS;

   end;

begin

   intI := 0;
   AssignFile( tfEntrada, 'nomes_tst_0001.txt' );
   Reset( tfEntrada );

   lerUm;

   while not Eof ( tfEntrada ) do
   begin

     mmEntrada.Lines.Add( strA + strS ); //I move for TMemo(mmEntrada, mmSaida), in the form

     mmSaida.Lines.Add( strA + strS );

     lerUm;

  end;

  CloseFile( tfEntrada );

end;

база результатов

001 - Alcides Joà £ o Pereira
002 - Alvir Maçaneiro
003 - Auto Elérica Imamura Ltda
004 - Auto Peças Araójo
005 - Auto Peças Porto Eixo Ltda
006 - Auto Peças Unià £ o
007 - Azambuja Industria Comercio de Materiais de Construção o Ltda
008 - Balaroti Comercio De Materiais De Construção £ Ltd
009 - Baldissera Logística e Transportes Ltda Me
010 - Battistella VeÃcuculos Pesados ​​Ltda
011 - Бертон Дизель Авто Пеас 012 - Bisolo Materiais de Construção £ Ltd

1 Ответ

4 голосов
/ 17 марта 2011

Не используйте AssignFile. Это устаревший код, и он не работает с UnicodeStrings. Вместо этого используйте TStringList или TFileStream для чтения файла.

[непроверенная]

procedure ReadFile;  
var  
  vFileReader : TstringList;  
begin  
  vFileReader := TStringList.Create;  
  try
    vFileReader.LoadFromFile('nomes_tst_0001.txt');  
    mmEntrada.Lines.Assign(vFileReader);  
  finally
    vFileReader.Free;  
  end;
end;

EDITED

Другим хорошим решением является функция follow, которую я написал очень давно:

[испытания]

function GetFileAsString(aFileName: string; aOffSet : Integer = 0; aChunkSize: Integer = -1): string;
var
  vStream: TFileStream;
  vBuffer: TBytes;
  vCurEncoding, vDefEncoding: TEncoding;
  vOffSet: Integer;
  vFileSize: Int64;
begin
  vCurEncoding := nil;
  vDefEncoding := TEncoding.Default;
  vStream := TFileStream.Create(aFileName, fmOpenRead + fmShareDenyNone);
  try
    if aChunkSize > 0 then begin
      vFileSize := aChunkSize;
    end
    else begin
      vFileSize := vStream.Size;
    end;
    vStream.Position := aOffSet;
    SetLength(vBuffer, vFileSize);
    vStream.ReadBuffer(Pointer(vBuffer)^, vFileSize);
    vOffSet := TEncoding.GetBufferEncoding(vBuffer, vCurEncoding);
    if (vCurEncoding <> vDefEncoding) then begin
      vBuffer := TEncoding.Convert(vCurEncoding, vDefEncoding, vBuffer, vOffSet,   vFileSize - vOffSet);
    end;
    Result := vDefEncoding.GetString(vBuffer);
  finally
    vStream.Free;
  end;
end;

Эта функция может обрабатывать Unicode-строки (с спецификацией), а также отменять строки. На самом деле, он может читать все виды текстовых файлов, которые у вас есть.

...