gpt4 book ai didi

delphi - 字符串到缓冲区的额外空格 Filestream.WriteBuffer 方法中隐式的 void 类型转换

转载 作者:行者123 更新时间:2023-12-01 17:22:16 25 4
gpt4 key购买 nike

有一段时间不需要在这里发帖了,但我在实现文件流时遇到了问题。将字符串写入文件流时,结果文本文件在每个字符之间插入了额外的空格

所以当运行这个方法时:

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 类。创建对象时提供输出流(或文件名)和编码。然后调用 WriteWriteLine 添加文本。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com