我正在使用WideString的ExtractFileName等于'STF:宋体'。 结果是'??'。德尔福 - ExtractFileName弄乱unicode
看来ExtractFileName不能很好地处理unicode。
是否有一个等效的方法为Unicode?
编辑:
这是该行我使用
NameStr := ExtractFileName(Name);
的类型有:
NameStr:String;
Name:PWideChar
我正在使用WideString的ExtractFileName等于'STF:宋体'。 结果是'??'。德尔福 - ExtractFileName弄乱unicode
看来ExtractFileName不能很好地处理unicode。
是否有一个等效的方法为Unicode?
编辑:
这是该行我使用
NameStr := ExtractFileName(Name);
的类型有:
NameStr:String;
Name:PWideChar
您还可以使用TntSysUtils.WideExtractFileName
从TNT。
你似乎是使用旧版本的Delphi不支持Unicode。解决方案是升级德尔福。
你是对的 - 我正在使用Delphi 2006.在这一点上升级版本不是一个选项(不能承担风险)。有没有办法解决这个问题没有升级? – 2011-04-05 07:37:49
你将不得不推出你自己的所有字符串操作例程。如果有很多,那么升级的风险就会小一些。如果只有少数,那么你可能会好起来的。您需要停止使用字符串(即AnsiString)并坚持使用WideString。 – 2011-04-05 07:59:13
您可以使用自制版ExtractFileName
,像这样:
function ExtractFileNameW(FullPath:WideString):WideString;
var i,pos:Integer;
begin
// Find the last path separator
pos := -1;
for i:=Length(FullPath) downto 1 do
if (FullPath[i] = '/') or (FullPath[i] = '\') then
begin
pos := i;
Break;
end;
if pos = -1 then
Result := FullPath
else
begin
Result := '';
SetLength(Result, Length(FullPath) - pos);
System.Move(FullPath[pos+1], Result[1], (Length(FullPath) - pos) * SizeOf(WideChar));
end;
end;
...但如果你真的需要处理Unicode字符,你应该升级到XE。它确实有很大的不同。
Function ExtractFileNameW(const FN: widestring): widestring;
begin
Result := UTF8Decode(ExtractFileName(UTF8Encode(FN)));
end;
ExtractFileName与Unicode Delphi完美配合。你正在使用哪个版本? – 2011-04-05 07:13:28
在Delphi XE中测试并在运行ShowMessage(ExtractFileName('STF:宋体'))时得到'宋体';' – 2011-04-05 07:13:32
使用ExtractFileName和Unicode文件名没有任何问题。你知道WideString <> UnicodeString(这是默认的Delphi字符串)吗?请显示你的代码,特别是变量声明,否则我们只会在黑暗中刺伤。 – 2011-04-05 07:14:58