2017-05-17 12 views
1

Windows XP/7/10をターゲットとするLazarus(1.5)fpc(3.1.1)でアプリケーションを書いています。 私のアプリケーションは、ユーザが選択したいくつかのパスでファイルシステムのファイルを読み書きします。パスまたはファイル名は、例えば(A〜Eéのような)特殊文字が含まれている場合:Lazarus ListBox SaveToFileファイル名に特殊文字

C:

'EFCreateError' できませんに:\ユーザーは\DeAndrè\

アプリケーションout.txtを例外を発生させますファイル "C:\ Users \DeAndrè\ out.txt"を作成します。フォームTListBoxコンポーネント(ListBox1が)に ドラッグし、2のTButton(ボタン1とボタン)とTSaveDialog(SaveDialog1):

はSIGLEフォームで簡単なアプリケーションを書いて、この問題を再現することが可能です。 (のみListBox1が上のいくつかのデータを書き込むために使用される)のButton1のOnClickイベントで

:Button2ののOnClickイベントで

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    // Simple Add Hello to ListBox 
    ListBox1.Items.Add('Hello '+IntToStr(ListBox1.Items.Count)); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    if SaveDialog1.Execute then 
    begin 
    ListBox1.Items.SaveToFile(SaveDialog1.FileName); 
    end; 
end; 

は、アプリケーションを実行し、 "ボタン1" いくつかをクリックしてくださいいくつかの言葉をリストに追加してからButton2をクリックし、特殊文字を含むパスにコンテンツを保存してみてください。

私はFileNa私は機能UTF8ToAnsiで動作しますが、なぜですか? Windows FileSystemはUTF8ではありませんか?

ソリューションには「標準」がありますか?たとえば、正しいモードでファイルシステムを使用するようにアプリケーションを設定するか、それとも類似していますか? 「プロジェクト」で

:あなたは、「カスタムオプション」に-dEnableUTF8RTLを追加する必要がありますUnicodeAPIを使用するようにラザロを有効にするには :

は、私は解決策を見つけたルディとダビデの方向後あなた

+0

@RudyVelthuis私のWindowsインストールでは、[このリンク](https://msdn.microsoft.com/en-us/library/windows/desktop/dd317748(v = vs。 85).aspx)はUnicode – AndreaBoc

+0

Unicode APIを呼び出すlazarusコード –

+0

@David Delphi(XE8)の同じサンプルコードはエラーなしで動作します... – AndreaBoc

答えて

0

ありがとうございました - > "プロジェクトオプション" - > "追加" に

クリック "を追加し、オーバーライド" - > "カスタムオプション" と追加

-dEnableUTF8RTL 

この強制コンパイラは、FileSystem AccessにUnicodeを使用するよう強制します。

[RTLでUTF8を設定]ボタンをクリックすることもできます。 -dEnableUTF8RTLに加えて、このボタンはオプションを追加します。

ラザロフォーラムのこのリンクで
-FcUTF8 

通常:http://forum.lazarus.freepascal.org/index.php?topic=27240.0 LazarusとUTF8について「ウィキ」ページからの抜粋がありますRTLは文字列にシステムコードページを使用します(FileExists およびTStringList.LoadFromFileなど)。 Windowsの場合、これは非Unicode エンコードなので、言語グループの文字しか使用できません。 LCLは、完全なUnicode範囲であるUTF-8エンコーディングで動作します。On LinuxおよびMac OS XのUTF-8は、通常はシステムのコードページなので、RTL はデフォルトでCP_UTF8を使用します。

FPC 2.7.1以降、RTLのデフォルトのシステムコードページは、 をUTF-8(CP_UTF8)に変更することができます。 Windowsユーザは RTLでUTF-8文字列を使用できるようになりました。