Lazarus解决含中文文件名或路径的使用问题
其实用lazarus很久(也不算久啦。。),目前打算做完手头的最后一个小程序然后就转向c#窗体程序。。之前用lazarus的时候出了很多问题,资料也不是很好找,所以这回把比较容易说的记下来省得忘掉。
Lazarus读取中文文件名并显出来这个过程并没多大问题,但是实际会出现各种各样的问题。比如加载一个路径或标题包含中文的文件,软件显示出来的路径甚至正常但是就是不能正常使用文件。那么,先上解决方案好了。。
当你获取文件路径时,这样处理文件路径:
1 pathvar:=utf8toansi(FilePath);
这样之后,使用文件时就可以通过pathvar调用文件而不出错。不过,如果这样处理后,想要在窗体中显示文件名,你还需要做如下工作:
1 Label1.Caption:=ansitoutf8(FilePath);
实际使用时,你需要使用的是转为ansi的路径字符串,但是为了显示不出乱码,你需要将处理过的路径在显示时转回utf8.
我的某个程序中的一部分代码(节选):
1 with OpenDialog1 do 2 begin 3 Filter:='TGE GUI File(*.gui)|*.gui'; 4 DefaultExt:='gui'; 5 FileName:=''; 6 Options:=[ofHideReadOnly,ofEnableSizing]; 7 if Execute then 8 if ofExtensionDifferent in Options then 9 Options:=[ofHideReadOnly,ofEnableSizing] 10 else 11 begin 12 filepath:=utf8toansi(FileName); //*1 13 end; 14 end; 15 end; 16 Label1.Caption:=ansitoutf8(filepath); //*2 17 if not FileExists(PChar(filepath)) then exit; //*3 18 assignfile(guiFile, filepath);//'test.gui' 19 reset(guiFile); 20 assignfile(guiFile, filepath);//*4 21 reset(guiFile);
上面的代码中,FileName就是直接获取到的文件的路径,在一开始(*1)用filepath记录了变量。之后在下面(*2)为了显示正常而转回utf8用语Label的显示,之后在(*3和*4)的调用中,直接使用了filepath。这样就是正常的了。
以上是上面所摘抄部分代码的原来的程序执行时的样子。