unicode文本的问题

时间:2016-01-10 20:26:09

标签: delphi unicode delphi-xe3

我使用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;

我真的很困惑

1 个答案:

答案 0 :(得分:4)

首先,您应该使用UnicodeString而不是WideStringUnicodeString在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字符编码,它们只是不同的内存管理)。因此,没有数据转换正在执行。

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)