2017-05-17 6 views
1

J'écris une application avec Lazarus (1.5) fpc (3.1.1) ciblant Windows XP/7/10. Mon application lire et écrire des fichiers dans le système de fichiers dans un chemin choisi par les utilisateurs. Si le chemin ou le nom de fichier contiennent des caractères spéciaux (comme à è é) par exemple:Lazarus ListBox SaveToFile Nom de fichier avec des caractères spéciaux

C: \ Users \ DeAndre \ out.txt

application soulèvent l'exception:

'EFCreateError' Impossible de crée le fichier "C: \ Users \ DeAndrè \ out.txt".

est possible de reproduire ce problème écrire une application simple avec une forme Sigle: glisser sous la forme d'un TListBox (ListBox1), deux TButton (Button1 et Button2) et un TSaveDialog (SaveDialog1).

En cas OnClick de Button1 (utilisé uniquement pour écrire des données sur ListBox1):

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

En cas OnClick Bouton2:

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

Lancez l'application et cliquez sur "Button1" certains fois (juste pour ajouter quelques mots dans la liste) puis cliquez sur Button2 et essayez d'enregistrer le contenu dans un chemin contenant des caractères spéciaux ...

J'ai remarqué que si je convertis FileNa moi avec la fonction UTF8ToAnsi ça marche, mais pourquoi? Windows FileSystem n'est pas UTF8?

Une solution "standard" existe-t-elle? par exemple définir l'application pour utiliser le système de fichiers en mode correct ou similaire?

Merci

+0

@RudyVelthuis Merci, mes installations Windows utilisent NTFS FileSystem, selon [ce lien] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd317748 (v = vs. 85) .aspx) est Unicode – AndreaBoc

+0

Est-ce que le code Lazarus appelant l'API Unicode –

+0

@David même exemple de code dans Delphi (XE8) fonctionne sans erreur ... – AndreaBoc

Répondre

0

Après avoir trouvé les instructions de Rudy et David la solution: Pour permettre Lazare d'utiliser UnicodeAPI vous devez ajouter -dEnableUTF8RTL sur "Option personnalisée":

sur "Projet" -> "options du projet" -> "Les ajouts et Override"

Cliquez sur "Ajouter" -> "Option personnalisée" et Ajouter

-dEnableUTF8RTL 

Ce compilateur force à utiliser Unicode pour FileSystem Access.

Il est également possible de cliquer sur le bouton "Set UTF8 in RTL". Ce bouton en plus -dEnableUTF8RTL ajoute l'option:

-FcUTF8 

Dans ce lien de Lazarus Forum: http://forum.lazarus.freepascal.org/index.php?topic=27240.0 il y a un extrait de la page "Wiki" à propos de Lazare et UTF8:

Habituellement RTL utilise la page de codes système pour les chaînes (par exemple FileExists et TStringList.LoadFromFile). Sous Windows, il s'agit d'un encodage non Unicode , vous ne pouvez donc utiliser que des caractères de votre groupe linguistique. Le LCL fonctionne avec l'encodage UTF-8, qui est la gamme complète Unicode.Sur Linux et Mac OS X UTF-8 est généralement la page de codes du système, de sorte que RTL utilise ici par défaut CP_UTF8.

Depuis FPC 2.7.1, la page de codes système par défaut du RTL peut être modifiée en en UTF-8 (CP_UTF8). Les utilisateurs Windows peuvent désormais utiliser des chaînes UTF-8 dans le RTL .