Delphi2010中的编码错误

Delphi2010中的编码错误,delphi,delphi-2010,Delphi,Delphi 2010,我正在测试Delphi 2010,我犯了以下错误: 我是不是带着这个“096-Construção Ltda”的字符链进入的,我是不是只把她/它移到另一个变量,然后看看他/它“096-ConstruçÃo Ltda”剩下什么,有人知道如何找到它吗 入口基地 001圣佩雷拉阿尔西德斯酒店 002阿尔维·马萨内罗 003自动Elétrica Imamura Ltda 004 Auto Peças Araújo 005波尔图埃克索汽车有限公司 006 Auto Peças União 007 Aza

我正在测试Delphi 2010,我犯了以下错误:
我是不是带着这个“096-Construção Ltda”的字符链进入的,我是不是只把她/它移到另一个变量,然后看看他/它“096-ConstruçÃo Ltda”剩下什么,有人知道如何找到它吗

入口基地

001圣佩雷拉阿尔西德斯酒店 002阿尔维·马萨内罗
003自动Elétrica Imamura Ltda
004 Auto Peças Araújo
005波尔图埃克索汽车有限公司
006 Auto Peças União
007 Azambuja Industria Comercio de Materialis de Constructução Ltda
008巴拉罗蒂建筑材料公司
009 Baldisera Logística e运输Ltda Me
010 Battistella Veículos Pesados有限公司
011贝顿柴油汽车有限公司 012建筑材料有限公司

结果基础

001-Alcides JoÃo Pereira
002-阿尔维·马埃罗
003-自动Elétrica Imamura Ltda
004-自动Peças Araújo
005年-波尔图埃克索Ltda汽车有限公司
006年-汽车行业作为单一行业
007-建筑材料工业有限公司
008-巴拉罗蒂建筑材料公司 009-巴尔迪塞拉原木运输有限公司
010年-Battistella VeÃculos Pesados有限公司
011-伯顿柴油汽车有限公司
012-Ltda施工材料不得使用转让文件。这是一个遗留代码,不适用于Unicode Destrings。相反,使用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;
已编辑

另一个很好的解决方案是我很久以前编写的以下函数:

[测试]

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;
函数GetFileAsString(aFileName:string;AOOffset:Integer=0;aChunkSize:Integer=-1):字符串; 变量 vStream:TFileStream; vBuffer:t字节; vCurEncoding、vDefEncoding:TEncoding; vOffSet:整数; vFileSize:Int64; 开始 vCURENCODE:=零; vDefEncoding:=TEncoding.默认值; vStream:=TFileStream.Create(文件名,fmOpenRead+fmsharedynone); 尝试 如果aChunkSize>0,则开始 vFileSize:=aChunkSize; 结束 否则开始 vFileSize:=vStream.Size; 结束; vStream.Position:=aOffSet; 设置长度(vBuffer、vFileSize); 读取缓冲区(指针(vBuffer)^,vFileSize); vOffSet:=TEncoding.GetBufferEncoding(vBuffer,vCuRecoding); 如果(vCurEncoding VDEFENCONDING),则开始 vBuffer:=TEncoding.Convert(vCurEncoding、vDefEncoding、vBuffer、vOffSet、vFileSize-vOffSet); 结束; 结果:=vDefEncoding.GetString(vBuffer); 最后 vStream.Free; 结束; 结束;
此函数能够处理unicode字符串(使用BOM)和反序列化。实际上,它可以读取所有类型的文本文件。

第二个字符串是第一个字符串的UTF-8编码形式。是否将字符串值指定给UTF8String变量?请显示您遇到问题的实际代码。您的字符串值仍然是UTF-8编码的。我怀疑这是因为您使用了不支持Unicode的旧syle Pascal文件I/O。我强烈建议您改用较新样式的VCL样式的文件I/O,例如将文件加载到TStringList中,然后在其中循环。下一次,请使用StackOverflow的代码格式化功能。只有当文件编码是默认编码(除非有BOM)时,此功能才起作用。我会使用额外的编码重载:TEncoding参数(当然我需要知道文件编码,否则我会遇到严重的麻烦)+1;旧式的文件处理例程(
AssignFile
Reset
Read
ReadLn
WriteLn
WriteLn
Close
)不能与Unicode一起使用。@mjn是的,你是对的。我只是想展示一下如何做得简单。@Jeroen:嗯,他们确实使用Unicode,你只需要显式编码/解码。
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;