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
而不是 WideString
。 UnicodeString
于 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
变量(WideString
和 UnicodeString
使用相同的 UTF-16 字符编码,它们只是不同的内存管理)。所以没有执行任何数据转换。
我使用 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
而不是 WideString
。 UnicodeString
于 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
变量(WideString
和 UnicodeString
使用相同的 UTF-16 字符编码,它们只是不同的内存管理)。所以没有执行任何数据转换。