2009-11-02 94 views
4

我正在測試德爾福2010年,我有以下錯誤:
我是否輸入了這個字符串「096 - ConstruçãoLtda」,並且我只是將她/它移動到另一個變量上並執行看他/它什麼離開「096 - Construção Ltda」,有沒有人知道如何找出那個?德爾福2010中的編碼錯誤

入口鹼

001阿爾西德斯若昂Pereira的
002 AlvirMaçaneiro
003自動Elétrica今村LTDA
004自動PECAS阿勞
005自動PECAS波爾圖Eixo LTDA
006自動PECAS União
007 Azambuja Industria Comercio de Materiais deConstruçãoLtda
008 Balaroti商報德,材料德ConstruçãoLTDA
009 Baldissera LOGISTICAËTRANSPORTES LTDA我
010 BattistellaVeículosPesados LTDA
011伯頓柴油汽車PECAS
012 Bisolo,材料去ConstruçãoLTDA

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 - 阿爾西德斯JOA£Ø佩雷拉
002 - AlvirMaçaneiro
003 - 自動ELA©trica今村LTDA
004 - 自動PeçasAraújo
005 - 自動Peças波爾圖Eixo LTDA
006 - 自動PeçasUNIA£Ø
007 - 阿贊布雅INDUSTRIA商報德,材料去ConstruçãØLTDA
008 - Balaroti商報德,材料德ConstruçãØLTDA
009 - BaldisseraLogÃsticaËTRANSPORTES LTDA我
010 - BattistellaVeÃculosPesados LTDA
011 - 伯頓柴油汽車Peças 012 - Bisolo,材料德ConstruçãØLTDA

+0

第二個字符串是第一個字符串的UTF-8編碼形式。你是否將字符串值分配給UTF8String變量?請顯示您遇到問題的實際代碼。 – 2009-11-03 07:41:07

+0

你的字符串值是stil是UTF-8編碼。我懷疑這是因爲你使用了舊的syle Pascal文件I/O,它不支持Unicode。我強烈建議您使用更新的VCL風格的文件I/O,例如將文件加載到TStringList中,然後循環。下次請使用StackOverflow的代碼格式化功能。 – 2009-11-05 00:27:16

回答

4

不要使用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

另外一個不錯的解決方案是後續的功能我寫了很久以前:

[測試]

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; 

這函數能夠處理unicod e字符串(帶BOM)以及ansistring。實際上,它可以讀取您擁有的所有文本文件。

+1

這隻有在文件編碼是默認編碼(除非有BOM)的情況下才有效。我會使用額外的Encoding:TEncoding參數來重載(當然我需要知道文件編碼,否則我會陷入嚴重的麻煩) – mjn 2011-03-17 06:37:00

+0

+1;舊式的文件處理例程('AssignFile','Reset','Read','ReadLn','Write','WriteLn','Close')不適用於Unicode。 – 2011-03-17 12:23:51

+0

@mjn是的,你是對的。我只是想展示如何做到這一點。 – 2011-03-17 12:41:19