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。这样就是正常的了。

    以上是上面所摘抄部分代码的原来的程序执行时的样子。


原文地址:https://www.cnblogs.com/blumia/p/Lazarus_Chinese_Display.html