发生了一个非常奇怪的情况:
(运行 Windows 7 Enterprise,SP1,64 位)
我在工作中使用的 GUI(专门为此目的而构建,旨在在 Windows 环境中运行)会生成 .dat 文件。我需要在使用前稍微编辑一下。我在普通的旧记事本中打开它,进行编辑并保存(一切看起来都很好)。当我用任何程序(Notepad、Notepad++ 等)重新打开它时,所有“新行”/“回车”/换行符都已被删除 - 所有内容似乎都混杂在一起,成为一条长线。
如果我只是在记事本中打开并关闭它而不保存,则不会发生任何变化,换行符也会出现在应有的位置。在 Notepad++ 或其他程序中打开文档并保存它不会影响换行符。将内容复制到 Notepad++ 并返回记事本也可以解决此问题 - 随后在记事本中保存不会影响换行符。
让这个问题变得更加棘手的是,这种行为并不适用于我的 GUI 生成的所有 .dat 文件。只是其中一部分。
对于正在发生的事情以及如何解决它,您有什么好的想法吗?
如果解决这个问题的方法是修改我的 GUI 生成文件的方式,那么这是一个可以接受的答案,因为我可以针对 GUI 提交错误报告。
但是……这似乎不太可能,因为我认为我的老板以前从未遇到过这个问题,而且他使用相同版本的 GUI 和记事本对文件进行细微修改。我最近也只遇到过这种情况,而且情况并不一致:以前出现过此问题的文件在当前版本的文件中使用记事本保存时不会丢失换行符。
编辑:更多信息:我将文件发送给我的老板,让他用计算机上的记事本打开并保存,但什么都没发生——保存、关闭并重新打开后,所有换行符都保留了下来。要么是发送过程修复了文件中的某些内容,要么是我的电脑出了问题。
查看已保存和未保存文件的十六进制:据我所知,未保存的版本在行之间有 0D0A,而保存的版本缺少 0D0A 的所有实例,除了最后的一个实例(我想知道这是否是在打开/转换文件时由 Notepad++ 添加的)。
再次编辑:编辑掉敏感信息后的“未保存”文件的十六进制版本:
2320504C4541534520434845434B3A20
544845524D5F43617020616E64204465
70436170206265666F72652072756E6E
696E67202121210D0D0A0D0D0A706172
616D20696E697469616C203A3D20313B
0D0D0A706172616D2054203A3D313735
32303B0D0D0A706172616D206474203A
3D20333630303B0D0D0A0D0D0A706172
616D204950505F4F524F203A3D20302E
313233343B0D0D0A706172616D205448
45524D5F4F524F203A3D20302E313233
343B0D0D0A706172616D20544845524D
5F436170203A3D2031323334353B0D0D
0A706172616D20446570436170203A3D
31323334353B0D0D0A234D572C204465
70656E6461626C652043617061636974
79206F662073747566660D0D0A090909
234E756D6265727320666F7220726566
6572656E63653A207468696E67732E0D
0D0A09090923446570656E6461626C65
204361703A2073747566660D0D0A7061
72616D20425546464552203A3D20303B
0D0D0A706172616D20636F6E76657274
203A3D20312E303B0D0D0A0D0D0A7061
72616D09525245534E504F494E545309
3A3D20353B0D0D0A706172616D095252
4553424B50093A3D0D0D0A31092D3132
33343530200D0D0A32092D3132333435
3030200D0D0A330930200D0D0A340931
32333435200D0D0A3509313233343520
0D0D0A3B0D0D0A0D0D0A706172616D09
525245534C4F5045093A3D0D0D0A3109
2D3132333435452D30350D0D0A32092D
3132333435452D30350D0D0A33092D31
32333435452D30350D0D0A3409313233
34350D0D0A3B0D0D0A0D0D0A2357696E
64792073747566660D0D0A706172616D
2057494E445F49433A3D0D0D0A706C61
63650931323334350D0D0A3B0D0D0A0D
0D0A706172616D207468696E67793A3D
0D0D0A706C6163650931323334350D0D
0A3B0D0D0A0D0D0A706172616D204F50
545F5265733A3D0D0D0A7468696E6709
300D0D0A3B0D0D0A0D0A
这是在记事本中保存并重新打开后的十六进制代码:
2320504C4541534520434845434B3A20
544845524D5F43617020616E64204465
70436170206265666F72652072756E6E
696E6720212121706172616D20696E69
7469616C203A3D20313B706172616D20
54203A3D31373532303B706172616D20
6474203A3D20333630303B706172616D
204950505F4F524F203A3D20302E3132
33343B706172616D20544845524D5F4F
524F203A3D20302E313233343B706172
616D20544845524D5F436170203A3D20
31323334353B09706172616D20446570
436170203A3D383632362E313B234D57
2C20446570656E6461626C6520436170
6163697479206F662073747566660909
09234E756D6265727320666F72207265
666572656E63653A207468696E677309
090923446570656E6461626C65204361
703A207374756666706172616D204255
46464552203A3D20303B706172616D20
636F6E76657274203A3D20312E303B70
6172616D09525245534E504F494E5453
093A3D20353B706172616D0952524553
424B50093A3D31092D31323334353020
32092D31323334353030203309302034
0931323334352035093132333435203B
706172616D09525245534C4F5045093A
3D31092D3132333435452D303532092D
3132333435452D303533092D31323334
35452D303534092D3132333435452D30
353B2357696E64792073747566667061
72616D2057494E445F49433A3D706C61
63650931323334353B706172616D2074
68696E67793A3D706C61636509313233
34353B706172616D204F50545F526573
3A3D7468696E6709303B0D0A
答案1
一些背景知识可能会有所帮助。记事本要求文件同时包含这两个字符,<CR><LF>
以便确定它是行尾并执行换行。如果缺少这两个字符中的任何一个,它将跳过它们并将所有内容显示在一行上。<CR><LF>
是 DOS/Windows 计算机上的标准换行符序列,而 Unix/Linux 及其衍生产品则用作<LF>
换行符。您正在打开的文件很可能只包含<LF>
它,因此记事本无法正确显示它。
这些文件很可能是由不遵循 Windows/DOS 文本格式约定的程序创建的。如果这只打算在 Windows 上运行,我认为需要提交错误报告,尤其是如果这些文件应该在记事本中编辑的话。
同时,我建议仅使用 Notepad++ 打开和编辑文件。
如果您想调试问题,请下载十六进制编辑器以查看行尾包含的内容。为了正确格式化 Windows,它应该包含十六进制代码 0d 0a。如果缺少任何一个或顺序不同,就会产生问题。尝试在从未从记事本保存过的新文件和已从记事本保存过的新文件上执行此操作。