2011-04-05 90 views
0

我正在使用WideString的ExtractFileName等于'STF:宋体'。 结果是'??'。德尔福 - ExtractFileName弄乱unicode

看来ExtractFileName不能很好地处理unicode。

是否有一个等效的方法为Unicode?

编辑:

这是该行我使用

NameStr := ExtractFileName(Name); 

的类型有:

NameStr:String; 

Name:PWideChar 
+4

ExtractFileName与Unicode Delphi完美配合。你正在使用哪个版本? – 2011-04-05 07:13:28

+0

在Delphi XE中测试并在运行ShowMessage(ExtractFileName('STF:宋体'))时得到'宋体';' – 2011-04-05 07:13:32

+0

使用ExtractFileName和Unicode文件名没有任何问题。你知道WideString <> UnicodeString(这是默认的Delphi字符串)吗?请显示你的代码,特别是变量声明,否则我们只会在黑暗中刺伤。 – 2011-04-05 07:14:58

回答

4

您还可以使用TntSysUtils.WideExtractFileNameTNT

1

你似乎是使用旧版本的Delphi不支持Unicode。解决方案是升级德尔福。

+0

你是对的 - 我正在使用Delphi 2006.在这一点上升级版本不是一个选项(不能承担风险)。有没有办法解决这个问题没有升级? – 2011-04-05 07:37:49

+0

你将不得不推出你自己的所有字符串操作例程。如果有很多,那么升级的风险就会小一些。如果只有少数,那么你可能会好起来的。您需要停止使用字符串(即AnsiString)并坚持使用WideString。 – 2011-04-05 07:59:13

0

您可以使用自制版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。它确实有很大的不同。

0
Function ExtractFileNameW(const FN: widestring): widestring; 
begin 
    Result := UTF8Decode(ExtractFileName(UTF8Encode(FN))); 
end;