簡體   English   中英

帶有字符串的額外空格緩沖Filestream.WriteBuffer方法中隱含的void類型轉換

[英]extra spaces with string to buffer void type conversion implicit in Filestream.WriteBuffer method

不需要在這里發布一段時間,但我在實現文件流時遇到問題。 將字符串寫入文件流時,resultnig文本文件在每個字符之間插入了額外的空格

所以在運行這個方法時:

Function TDBImportStructures.SaveIVDataToFile(const AMeasurementType: integer;
  IVDataRecordList: TIV; ExportFileName, LogFileName: String;
  var ProgressInfo: TProgressInfo): Boolean; // AM
var
  TempString: unicodestring;
  ExportLogfile, OutputFile: TFileStream;
begin
  ExportLogfile := TFileStream.Create(LogFileName, fmCreate);
  TempString :=
    'FileUploadTimestamp, Filename, MeasurementTimestamp, SerialNumber, DeviceID, PVInstallID,'
    + #13#10;
  ExportLogfile.WriteBuffer(TempString[1], Length(TempString) * SizeOf(Char));
  ExportLogfile.Free;

  OutputFile := TFileStream.Create(ExportFileName, fmCreate);
  TempString :=
    'measurementdatetime,closestfiveseconddatetime,closesttenminutedatetime,deviceid,'
    + 'measuredmoduletemperature,moduletemperature,isc,voc,ff,impp,vmpp,iscslope,vocslope,'
    + 'pvinstallid,numivpoints,errorcode' + #13#10;
  OutputFile.WriteBuffer(TempString[1], Length(TempString) * SizeOf(Char));
  OutputFile.Free;
end;

(這是一種精簡測試方法,僅編寫標題)。 生成的'OutPutFile'的csv文件讀取

'measuredmoduletempera ture,etcetera在wordpad中查看,但不在excel,notepad等中。我猜它是在unicode上下文中出錯的SizeOf(Char)語句,但我不確定什么是正確的東西插入這里。 'ExportLogfile'似乎工作正常但不是'OutPutFile'

從我在其他地方讀到的是unicode寫的問題而不是寫字板,請參閱http://social.msdn.microsoft.com/Forums/en-US/7e040fd1-f399-4fb1-b700-9e7cc6117cc4/ Unicode到文件和控制台-VS-記事本,寫字板,文字等?論壇= vcgeneral

有人建議嗎? 非常感謝,Brian

您正在編寫16位UTF-16編碼字符。 然后將文本視為ANSI編碼文本。 這種不匹配解釋了這種行為。 實際上你沒有多余的空格,那些是零字節,被解釋為空字符。

您需要決定要使用的編碼。 哪些程序會讀取文件? 他們期待哪種文本編碼? 很少有讀取csv文件的程序理解UTF-16。

快速解決方法是切換到使用AnsiString ,這將導致8位文本。 但是不支持國際文本。 你需要支持國際文本嗎? 那么也許你需要UTF-8。 你可以再次使用Utf8String進行快速修復,但我認為你應該看得更深。

處理文本到二進制轉換很奇怪。 使用TStringList ,調用Add來添加行,然后在保存文件時指定編碼會更簡單。

List.Add(...);
List.Add(...);
// etc. 
List.SaveToFile(FileName, TEncoding.UTF8);

或許更優雅的方法是使用TStreamWriter類。 在創建對象時提供輸出流(或文件名)和編碼。 然后調用WriteWriteLine來添加文本。

Writer := TStreamWriter.Create(FileName, TEncoding.UTF8);
try
  Writer.WriteLine(...);
  // etc. 
finally
  Writer.Free;
end;

我在這里假設了UTF-8,但您可以輕松指定不同的編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM