unicode 文本的问题

Problems with unicode text

我使用 delphi xe3,我有一个小问题!!但是我不知道怎么解决..

这个字母“è”有问题这个字母在文件路径中 "C:\lène.mp4"

我将此路径保存到 tstringlist 中,当我将此 tstringlist 保存到文件时,路径将在 txt 文件中显示 fine..

但是当尝试使用 tstringlist 加载它时,它将显示为“_”(在备忘录或 int 变量中显示)在这种情况下它将是一个无效路径..

但是将路径(字符串)直接添加到 tstring 列表,然后将其传递给路径变量,它工作正常

但是从文件加载并传递给路径变量它不起作用(获取“è”而不是“è”)

通常我会使用很多 uncite 字符串,但我正在努力处理那个字母

这行不通..

    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;

我真的很困惑

首先,您应该使用 UnicodeString 而不是 WideStringUnicodeString 于 2009 年 Delphi 推出,比 WideString 效率更高。 RTL 在 2009 年以前使用 AnsiString 的所有地方(几乎)都使用 UnicodeString

其次,Delphi 2009 中引入的另一个东西是SysUtils.TEncoding,用于字节<->字符转换。几个现有的 RTL 类,包括 TStrings/TStringList,已更新为在转换字节 to/from 字符串时支持 TEncoding

当您将文件加载到 TStringList 时发生的事情是分配一个内部 TEncoding 对象以帮助将文件的原始字节转换为 UnicodeString 值。如果没有明确说明(LoadFromFile() 有一个可选的 AEncoding 参数),它使用哪个 TEncoding 实现取决于 LoadFromFile() 认为文件正在使用的字符编码。如果文件具有 UTF BOM,则使用匹配的 TEncoding,无论是 TEncoding.UTF8 还是 TEncoding.(BigEndian)Unicode。如果不存在 BOM,并且未使用 AEncoding 参数,则使用 TEncoding.Default,表示 OS 的默认字符集区域设置(因此提供与现有预编译器的向后兼容性2009 代码).

TStringList 保存到文件时,如果列表以前是从文件加载的,则用于加载的相同 TEncoding 用于保存,否则使用 TEncoding.Default (同样,为了向后兼容),除非被 SaveToFile().

的可选 AEncoding 参数覆盖

在您的第一个示例中,输入文件很可能采用没有 BOM 的 UTF-8 编码。所以 LoadFromFile() 会使用 TEncoding.Default 来解释文件的字节。 èè(字节八位字节 0xC3 0xA8)的 UTF-8 编码形式被误解为 Windows-1252 而不是 UTF-8 的结果。因此,您必须改为像这样加载文件:

xfiles.LoadFromFile('C:\Demo6-out.txt', TEncoding.UTF8);

在您的第二个示例中,您没有加载文件或保存文件。您只需将字符串文字(在 D2009+ 中为 unicode-aware)分配给 UnicodeString 变量(在 TStringList 内),然后将其分配给 WideString 变量(WideStringUnicodeString 使用相同的 UTF-16 字符编码,它们只是不同的内存管理)。所以没有执行任何数据转换。

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