2014-09-29 30 views
1

不需要在这里留言一段时间,但是我在实现文件流时遇到问题。 当写一个字符串FILESTREAM时,resultnig文本文件具有运行此方法时插入每个字符之间带字符串的额外空格缓冲void类型转换隐式地在Filestream.WriteBuffer方法中

所以多余的空格:

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,等等写字板中查看时,而不是在Excel中,记事本等 我猜它的sizeof运算(char)的说法是错误的unicode上下文,但我不确定在这里插入什么是正确的。 的“ExportLogfile”似乎工作确定,但不是“OUTPUTFILE”

从我读过其它地方的写作以unicode这是问题&不写字板,看http://social.msdn.microsoft.com/Forums/en-US/7e040fd1-f399-4fb1-b700-9e7cc6117cc4/unicode-to-files-and-console-vs-notepad-wordpad-word-etc?forum=vcgeneral

任何建议人? 非常感谢,布赖恩

回答

3

您正在编写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,但您可以轻松指定不同的编码。

+0

大卫,清晰和非常有帮助的答案一如既往,非常感谢,布赖恩 – SolarBrian 2014-09-30 10:16:24

相关问题