2014-01-14 51 views
0

这个问题将有一个非常简单的答案是是的没有我猜?编码ASCII文件

如果我从64位Unicode Delphi应用程序编码我的StringList这样

StringList.SaveToFile(FileName, TEncoding.ASCII); 

还有没有其他的限制,差异文件格式,同时将与所述声明该文件

StringList.SaveToFile(FileName); 

StringList.SaveToFile(FileName, TEncoding.UTF8); 

我怕在线长度和控制博之间的问题博th版本....答案否会让我高兴。

+0

如果该参数对输出没有影响,您为什么认为它完全存在? –

回答

2

区别仅仅在于使用的编码。这当然会导致大小的差异。因此,ASCII文件将比UTF-16小(你用TEncoding.Unicode得到的结果,而UTF-8文件的大小可能与ASCII大小相同,或者大于UTF-16)。 UTF-8以任何方式破坏了写入的文本,如果文本中包含非ASCII字符,那么将使用ASCII。ASCII只能编码127个字符

另一方面,UTF-8是一种完整的编码的统一。这意味着,具有完全相同的内容

StringList.SaveToFile(FileName, TEncoding.UTF8); 
StringList.LoadFromFile(FileName, TEncoding.UTF8); 

结果列表中,因为它没有之前保存。

你问如果行可以被截断SaveToFile。他们不可以。

另一点是32/64位在这里不相关。该代码在32位和64位下的行为完全相同。问题总是与编码有关。

我也会注意到,你的问题的标题有些误导。当你用TEncoding.UTF8进行编码时,你没有一个ASCII文件。

+0

你最后的陈述是不真实的*如果*没有写出BOM *和*只有字符在ASCII范围内 –

+0

@ChrisRolliston不是我想到它的方式。我会说这仍然是一个UTF-8文件。它只是与ASCII文件无法区分。 –

+0

我会说这是两个。 ASCII是UTF-8的一个子集(或者UTF-8是超集)。这意味着数学上只包含ASCII字符的字符串将是ASCII和UTF-8(和ISO-8859-1 ...)。 1也是一个自然数,一个整数和一个分数等等,你不能区分。 –

3

UTF-8和Windows的'Ansi'代码页都是ASCII的超集。因此,如果字符串列表只含有ASCII范围内的字符,你列出的三个语句会,如果你在前面加上最后这个是等价的:

StringList.WriteBOM := False; 

这是因为默认情况下,TStrings会写出来的小标记(BOM)来表示UTF-8文本。

+0

第一条和第三条声明是等价的,但不一定是第二条。如果编码为UTF-16,其输出将有所不同。 –

+0

@RobKennedy - SaveToFile的单参数版本将使用“TEncoding.Default”,除非先前调用了“LoadFromFile”或“LoadFromStream”并找到了BOM,或者“DefaultEncoding”属性已经事先明确设置 - 'TEncoding.Default'映射到Windows上的TEncoding.Ansi,否则映射为'TEncoding.UTF8'。 –

+0

感谢您提供额外的细节以加强我的评论@Chris。 –