我使用delphi xe3,我的问题很小!!但我不知道如何解决它..
问题是这封信“è”这封信是在文件路径“C:\lène.mp4”中
我将此路径保存到tstringlist中,当我将此tstringlist保存到文件时,路径将在txt文件中显示 fine ..
但是当尝试使用tstringlist加载它时,它将显示为“Ô(显示在备忘录或int变量中),在这种情况下,它将是一个无效的路径..
但是将路径(字符串)直接添加到tstring列表然后将其传递给路径变量它可以正常工作
但从文件加载并传递给路径变量它不起作用(得到“Ô而不是“è”)
通常情况下,我会使用很多无效的字符串,但因为我正在努力使用那封信
这不起作用..
var
resp : widestring;
xfiles : tstringlist;
begin
xfiles := tstringlist.Create;
try
xfiles.LoadFromFile('C:\Demo6-out.txt'); // this file contains only "C:\lène.mp4"
resp := (xfiles.Strings[0]);
// if i save xfiles to a file "path string" will be saved fine ... !
finally
xfiles.Free ;
end;
但是像这样工作..
var
resp : widestring;
xfiles : tstringlist;
begin
xfiles := tstringlist.Create;
try
xfiles.Add('C:lène.mp4');
resp := (xfiles.Strings[0]);
finally
xfiles.Free ;
end;
我真的很困惑
答案 0 :(得分:4)
首先,您应该使用UnicodeString
而不是WideString
。 UnicodeString
在Delphi 2009中引入,比WideString
更有效。 RTL使用UnicodeString
(几乎)之前在2009年之前使用AnsiString
的所有位置。
其次,Delphi 2009中引入的其他内容是SysUtils.TEncoding
,用于Byte< - >字符转换。在将字节转换为字符串/从字符串转换字节时,已更新了几个现有的RTL类,包括TStrings
/ TStringList
,以支持TEncoding
。
将文件加载到TStringList
时会发生什么情况,分配内部TEncoding
对象以帮助将文件的原始字节转换为UnicodeString
值。它使用的TEncoding
的哪种实现取决于LoadFromFile()
认为文件正在使用的字符编码,如果没有明确说明(LoadFromFile()
具有可选的AEncoding
参数)。如果文件包含UTF BOM,则使用匹配的TEncoding
,无论是TEncoding.UTF8
还是TEncoding.(BigEndian)Unicode
。如果没有BOM,并且未使用AEncoding
参数,则使用TEncoding.Default
,它表示操作系统的默认字符集区域设置(因此提供与现有2009年前代码的向后兼容性)。
将TStringList
保存到文件时,如果先前从文件加载了列表,则用于加载的TEncoding
用于保存,否则使用TEncoding.Default
(同样,为了向后兼容),除非被AEncoding
的可选SaveToFile()
参数覆盖。
在第一个示例中,输入文件很可能是在没有BOM的情况下以UTF-8编码的。因此LoadFromFile()
将使用TEncoding.Default
来解释文件的字节。 è
是UTF-8编码形式的è
(字节八位字节0xC3 0xA8
)被误解为Windows-1252而不是UTF-8的结果。所以,你必须加载这样的文件:
xfiles.LoadFromFile('C:\Demo6-out.txt', TEncoding.UTF8);
在第二个示例中,您没有加载文件或保存文件。您只是将字符串文字(在D2009 +中识别为unicode)分配给UnicodeString
变量(在TStringList
内),然后将其分配给WideString
变量({{1 }和WideString
使用相同的UTF-16字符编码,它们只是不同的内存管理)。因此,没有数据转换正在执行。