- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一段时间不需要在这里发帖了,但我在实现文件流时遇到了问题。将字符串写入文件流时,结果文本文件在每个字符之间插入了额外的空格
所以当运行这个方法时:
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 文件为
在写字板中查看时测量模块温度等,但在 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
大家有什么建议吗?非常感谢,布莱恩
最佳答案
您正在编写 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
类。创建对象时提供输出流(或文件名)和编码。然后调用 Write
或 WriteLine
添加文本。
Writer := TStreamWriter.Create(FileName, TEncoding.UTF8);
try
Writer.WriteLine(...);
// etc.
finally
Writer.Free;
end;
我在这里假设使用 UTF-8,但您可以轻松指定不同的编码。
关于delphi - 字符串到缓冲区的额外空格 Filestream.WriteBuffer 方法中隐式的 void 类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26104902/
我是一名优秀的程序员,十分优秀!