Polskie znaki w nazwach plików.

0

Witam

Podpowiedzcie mi proszę w jaki sposób w kodzie programu mogę odwołać się do programu który w nazwie ma polskie znaki.
np:

CopyFile(ExtractFilePath(Application.ExeName)+'stół.jpg', 'c:\krzesło.jpg')

.
Program zwraca błąd, bo zamiast 'ó' i 'ł' widzi krzaczki...

Sprawa dotyczy Lazarusa.

Z góry dziękuje za pomoc.

0

Spróbuj skorzystać z funkcji UTF8ToSys (wymaga FileUtil).

0

UTF8ToSys nie zdaje egzaminu - nadal problemy z krzaczkami

0
 CopyFile(UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'stół.jpg',) UTF8ToAnsi('c:\krzesło.jpg')); 

Pozdrawiam
Paweł Dmitruk

0

Na wzór tego co napisał Paweł wklepałem :

 copyfile(UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.exe'),UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.back')); 

Pogram wywala błąd:
blad.jpg

1

Najprawdopodobniej ten jak i inne twoje problemy z kodowaniami wynikają z tego że w Lazarusie nie wybrałeś odpowiedniego kodowania (Starsze Lazarusy generowały ANSI, nie UTF8). Rozwiązanie: Zmień Lazarus na najnowszy i ustaw kodowanie na UTF8 i większość twoich problemów zniknie/uprości się.
Pozdrawia Pan z odliczaniem od 3 i wyrażeniem 'oh'.

0

Zamiast UTF8ToAnsi daj AnsiString a jak nic nie da sprawdź czy unit z tym kodem zapisany jest w formacie UTF-8 (powinien być).

0

to zobacz inaczej: dodaj do Uses moduł LConvxEncoding i zamiast UTF8ToAnsi</code> użyj <code class="delphi">UTF8ToCP1250

pozdrawiam
paweld

LConvEncoding - prawidłowa nazwa modułu.

Pozdrawiam

0

W jaki sposób sprawdzić kodowanie w Lazarusie?
Otwierając Unit w Notepad++ pokazuje mi że mam "ANSI AS UTF-8"

Podane funkcje : AnsiString, AnsiString nie rozwiązują problemu .

0
hipekk napisał(a):

W jaki sposób sprawdzić kodowanie w Lazarusie?

Prawoklik na dokumencie -> Ustawienia pliku -> Kodowanie. Powinno być wybrane UTF-8 (nie BOM).

Jeżeli w Lazarusie zmienisz kodowanie to raczej powstaną ci krzaczki wobec czego użyj Notepada++, zapisując jako kodowanie UTF-8 (bez BOM).

0

Mam "UTF-8", więc teoretycznie powinno być dobrze ...

0
hipekk napisał(a):

Mam "UTF-8", więc teoretycznie powinno być dobrze ...

No to niestety nie wiem jak robisz że Ci nie działa bo u mnie Utf8ToAnsi('katalog\łtf.txt') działa dobrze w poniższym przykładzie:

program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

var
  sl:TStringList;
  f:text;

begin
  sl:=TStringList.Create;
  sl.LoadFromFile(Utf8ToAnsi('C:\łtf.txt'));
  assign(f,Utf8ToAnsi('C:\\łtf.txt'));
  {$I+}
  reset(f);
  close(f);
end.  

Kod wykonuje się bez problemów.
Po zmianie nazwy na taką jak podałeś również nie uświadczyłem problemów.

EDIT: Zauważyłem jeszcze że używasz CopyFile jednak nie jestem w stanie dociec o jaki moduł chodzi gdyż Windowsowe CopyFile wymaga jeszcze jednego parametru i pcharów.
EDIT#2: Zgaduję że chodzi o moduł fileutil (widzę że pytacz niestety nie wie jak poprawnie zadać pytanie [najprościej przez pokazanie przykładu który nie działa, ale w końcu to pytacz robi łaskę że pyta]). Więc kopiąc nieco wgłąb wychodzi że ten moduł na wejściu oczekuje UTF8 i sam konwertuje wszystko na odpowiednie parametry więc najprawdopodobniej ścieżki które podajesz nie są w UTF8 tylko np. część masz w ANSI a to co dodajesz jest w UTF8.

0

Nadal nie udało mi się wyeliminować błędu...
Przesyłam kod - może ktoś coś zauważy i podpowie...

Tak wygląda kod tego programiku:

 
procedure TForm1.FormActivate(Sender: TObject);
begin
   IdFtp1.Connect;

   IF FileExists(UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.back'))
   THEN
      begin
          DeleteFile(UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.back'));
      end;

   IF FileExists(UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.exe')) 
   THEN
      begin
         CopyFile(UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.exe'),UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.back'));
         DeleteFile(UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.exe'));
         IdFtp1.get('eNABIAŁ EXPRESS.exe',UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.exe'));
      end
   ELSE
      begin
         IdFtp1.get('eNABIAŁ EXPRESS.exe',UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.exe'));
      end;

   IdFtp1.Disconnect;

end;

0

Wiem, że to nie rozwiązanie problemu (na rozwiązanie nie mam pomysłu to które podałem wcześniej dziwnie u Ciebie nie działa) a jedynie może jego ominięcie są funkcje FileExistsUTF8 i DeleteFileUTF8 jest też RenameFileUTF8 przyda Ci się zamiast CopyFile i DeleteFile może spróbuj ich użyć.
Poza tym ten kod to masakra po co tyle razy "przygotowujesz" te same ścieżki wystarczą 2 zmienne np. source i dest ścieżki raz zapisać w nich a nie w kółko powtarzać połowę kodu.

0

Powtórzenie były zamierzone - stworzone na czas testów (eliminowania błędu).
Spróbuję użyć funkcji które podał KAzek.

0
 CopyFile(UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.exe'),UTF8ToAnsi(ExtractFilePath(Application.ExeName)+'eNABIAŁ EXPRESS.back'));

Wybacz mi, ale czy ty nie rozumiesz że funkcja CopyFile z modułu FileUtils oczekuje UTF-8?

Postaraj się może najpierw przeczytać, a potem nakodzić.

I albo wszystko raz a porządnie zmień na natywne dla Lazarusa UTF-8 i potem tylko szukaj funkcji które nie są zgodne, albo zrób analogicznie dla Ansi. Twoje zmiany w tą a potem w drugą gmatwają wszystko, już nie wiadomo co jest w ANSI a co w UTF-8. Sprawdź czy wszystkie twoje konwersje są w dobrą stronę i czy dane których się spodziewasz są w tym czego się spodziewasz (debugger ci pomoże).

1 użytkowników online, w tym zalogowanych: 0, gości: 1