Piszę ponieważ dotyka mnie dość poważny problem hamujący rozwój prac,
mianowicie nie mogę uporać sobie z polskimi znakami w nazwach plików
pobieranych przez Opendialog (dotyczy to zarówno file jak i image).
Wykonuję następujący kod aby przypisać do zmiennej typu string o
nazwie zdjęcie ścieżkę do zaznaczonego pliku :
if OpenPictureDialog1.Execute then //coś tam zrobiło
begin
zdjecie:=OpenPictureDialog1.FileName;
end
Następnie dodaję plik do strumienia w oparciu o jego nazwę pobraną
uprzednio.
Stream.AddFile( 'nieistotne', zdjecie, 'nieistotnymimetype' );
W linuksie, bez problemu akceptuje polskie znaki.
Mogę podać mu plik /home/ja/żźćąśę.jpg, wczyta bez problemów i doda
do strumienia.
Postanowiłem przenieść aplikację pod Windows XP SP3, kompilowane na
tej samej wersji Lazarusa.
W wypadku polskich znaków w nazwie pliku np
c:\ðśą.jpg , wyrzuca "Unable to open file xxx".
http://www.bankfotek.pl/view/479548
Jeżeli przekazuje np c:/test.jpg , nie ma żadnych problemów...
Dodam że powyższy napis, zawiera poprawną pisownię i nasze znaki.
Nie wiem gdzie szukać błędu, czy ma ktoś jakieś propozycje ?
pozdrawiam
Marek Karpowicz
Prawdopodobnie gdzieś zostaje przeinaczona ta nazwa pliku
na skutek nieprawidłowej konwersji kodowania znaków.
Ja bym sprawdził, na przykładzie kontrolki TSavePictureDialog
jaką nazwę będzie miał plik na dysku, gdy jako FileName
podasz mu np. zażółć_gęślą_jaźń.jpg
Może to coś rozjaśni co się dzieje z kodowaniem.
Sławek
Witaj,
Problem rozwiązany, ale jak do tego doszedłem...
Męczyła mnie kwestia tej kontrolki otwierania i okazało się że to nie
w niej bezpośrednio leży błąd.
Ona zwraca nam poprawną nazwę (jak na Windows-a), ale prawdopodobnie
tj na 99% biblioteka IdMultipartFormData nie obsługuje "Windowsowego
typu znaków".
Dla testu wprowadziłem mu następujący kod:
Stream.AddFile( 'zdjecie', 'c:\Ziółma.jpg', 'content-type_here' );
- wykonanie zakończyło się błędem, brak pliku "c:\Ziółma.jpg".
Kolejna próba, zastępując polskie znaki poprzez ich odpowiedniki ASCII
Stream.AddFile( 'zdjecie', 'c:\Zi'+chr(243)+chr(179)+'ma.jpg',
'content-type_here' );
- Próba zakończyła się sukcesem.
W związku z powyższym rozwiązaniem okazał się następujący kod:
zdjecie:=OpenPictureDialog1.FileName;
zdjecie:=Utf8ToAnsi(zdjecie);