Witam.
Podpowiedzcie jak ugryźć temat. Jest sobie plik zakodowany w UTF-8. W pliku znajdują się specyficzne znaki (umlauty niemieckie). Jak odczytuję zawartość i umieszczam w TStringGrid, to są krzaczki w tych miejscach. Jak to poprawnie odczytać, a potem jeszcze zapisać??
UTF-8 Conversion Routines - to powinno być pomocne.
Wczytaj dane jako AnsiString, następnie przekonwertuj ciąg do typu używanego w VCL.
Generalne zadziałało. Fajnie. Ale pojawił mi się kolejny problem. W pliku są fragmenty zapisane ........ cyrilicą, czy też innym krojem. Po zastosowaniu funkcji konwertującej, zamiast znaczków są znaki zapytania. Jak to rozwiązać?
Która wersja Delphi?
No niestety Turbo Delphi.
Nie znam kompletnie tego środowiska. W sumie to nieistotne. Komponenty obsługują unicode, czy tylko ansi?
A jak to sprawdzić?
Nie ma co sprawdzać, niestety nie obsluguje UNICODE.
Może spróbuj TNT Unicode Controls.
Tylko w TD raczej tego nie zainstaluję. Heh.
@furious programming: @Buster
Turbo Delphi pojawiło się w 2006 roku a z tego co wiem to obsługa UNICODE pojawiła się dopiero w D2009 , więc nie sądzę aby Turbo Delphi natywnie wspierało to kodowanie
Mam w TD funkcję UTF8ToUnicode. Ale za Chiny zjednoczone z Hong Kongiem nie wiem jak z niej skorzystać. Help w tej kwestii jest bardzo ubogi.
Ok.
Czy temat jest do ugryzienia??
@Buster:
to może przenieś projekt do Lazarusa (Free Pascala). Wydaje mi się że darmowy Free Pascal wspiera UNICODE, ale od Lazarusa i Free Pascala ekspertem jest @furious programming i jego warto było by zapytać
Myślę że warto było by zmienić nieco archaiczne narzędzie jakim jest Turbo Delphi na coś nowszego
@grzegorz_so: biblioteka komponentów Lazarusa natywnie obsługuje unikod pod postacią UTF-8, więc załadowanie zawartości pliku do kontrolek nie wymagałoby żadnych konwersji i innych dodatkowych czynności :]
Jeśli jest możliwość przeniesienia tego projektu do innego środowiska to warto się zastanowić. Wszystko zależy od tego, czy to projekt rozwijany prywatnie czy w pracy.
@Buster: poprzednik zdołał określić, że komponenty w tym środowisku nie obsługują unikodu. W stronie kodowej Windows 1250 są znaki niemieckie, więc powinieneś przekonwertować ciąg z UTF-8 do Ansi. Znajdź funkcję UTF8ToAnsi
i spróbuj jej użyć.
@furious programming:
ale autor postu wspomniał również o problemach z cyrlicą, więc tylko UNICODE równocześnie poradzi sobie i z cyrylicą i umlautami. Strony kodowe WINxxxx oparte o ośmobitowe kodowanie znaków nie rozwiążą problemu w sposób uniwersalny
@grzegorz_so: Poniekąd można by wspierać zagraniczne języki, mieszczące się w którejś 8-bitowej stronie kodowej (np. Win1250), jednak ograniczenia będą bardzo duże. Tak więc idealnego, natywnego dla tego środowiska rozwiązania raczej nie ma, chyba że pakiet kontrolek firm trzecich.
Co w dalszym ciągu nie zmienia faktu, że mamy 2017 rok, a nie 1997 i środowisko programistyczne nie wspierające unikodu to duża przeszkoda. Lazarus bez problemu obsłuży ~dowolny język, również cyrylicę. Tę sprawdzałem już dawno temu, przy okazji prac nad swoim formatem i biblioteką do jego obsługi.
@furious programming:
przerabiałem to bo mam czterojęzyczną aplikację, polski,słowacki, niemiecki i ukraiński, dopiero użycie UNICODE rozwiązało niemal wszystkie problemy językowe
Wróciłem do pierwotnej wersji źródła mojej aplikacji napisanej w Delphi 10.1. Z UTF-8 do Unicode-u bardzo ładnie sobie poradził. W TStringGrid wyświetla wszystko prawidłowo tj. umlauty, akcenty i nawet cyrylicę.
A jak zapisać teraz zawartość tego grida do pliku? Ale oczywiście tak, żeby zachowały się te wszystkie dziwne znaczki. ;)
Wykorzystaj TEncoding
.
Chyba nie za bardzo wiem jak. ;)
@Buster:
przykład ....
procedure savetofile(aFilename:string);
var
lTs: tstringlist;
begin
lTs := tstringlist.Create;
try
lTs.add('Відобразити');
lTs.SaveToFile(aFilename, tEncoding.UTF8);
finally
lTs.Free;
end;
end;
Wszystko działa. Wielkie dzięki wszystkim za okazaną pomoc. :)