Problemy z kodowaniem znaków - CPP Builder, Char Map i UTF8


(Whizz Kid) #1

Witam!

Otóż jak zwykle problemy natury programistycznej to u mnie kodowanie znaków. Otóż niedawno zabrałeś się za przepisanie mojego programu do CPP Buildera, by nadać mu GUI. Wszystko ładnie działało do momentu, w którym postanowiłem pod polem do wpisywania wyszukiwanych wyrazów dodać "klawiaturkę", która po kliknięciu w odpowiedni przycisk wkleja dany znak z diakrytykiem (ą, ę, ö etc.). Sama funkcja działa pięknie, schody zaczęły się przy literze: "à".

Nie mogę jej umieścić w CPP Builderze (wersja 6 Personal). W zależności, skąd ją kopiuję, wkleja mi ją albo jako czyste "a", kwadrat bądź dwuznak "a`". Otworzyłem plik Notepadem++ (kodowanie ustawione na UTF-8), gdzie ten znak spokojnie wklejałem, do pliku tekstowego, jednak... wszystkie wcześniej powpisywane znaki pozmieniało na kwadraty. Najpierw tę literę Wkleiło się jako "a", mimo że kopiowałem z innej karty tegoż programu!

Problemy są też m. in. w przypadku "ö", które program co CPP Builder wkleja jako kwadrat, ale w okienku po kompilacji wpisuje się ok.

Teraz moje pytanie: jak to zmienić? Nie znalazłem nigdzie zmiany kodowania w CPP Builder. Kiedy w końcu zmieniłem format kodu źródłowego i skompilowałem już wszystko przepisane na UTF-8, to mój program znaki poprawne w UTF kodował dalej starym sposobem, więc się wpisywały duże litery A ze znaczkami jako osobne znaki.

Ktoś zna rozwiązanie tego problemu? Jak Zmusić program do korzystania z UTF-8 (w wyświetlaniu i odczycie) w CPP Builder 6 Personal?

P.S. Prosiłbym o instrukcję w miarę krok po kroku, ponieważ tego typu problemy i programy to dla mnie nowość i zwyczajnie mam małą wiedzę na te tematy :slight_smile:

Edit: I jak zrobić, aby program wczytywał także dane z pliku z kodowaniem UTF-8? Jest co prawda w programie jakaś funkcja UTF-8 to Unicode czy coś w ten deseń, ale ja tego nie łapię za bardzo...


(Ryan) #2

Builder zapisywał w ISO-8859-coś (coś=ciężko zgadnąć, zależy od locale Windowsa), czyli na 8 bitach. Te same znaki interpretowane jako UTF-8 będą uszkodzone (UTF-8 ma zmienną długość znaku i specjalny system kodowania znaków o kodach spoza 0-127).

Builder dopiero w wersji 2009 wspiera Unicode (co powinno dać Ci do myślenia: dlaczego wybrałem tak archaiczne środowisko). Starsze wersje możesz zmusić do działania, ale czeka Cię sporo kodowania. Sugeruję zrobić dwie rzeczy: 1. wykonać port aplikacji do VS lub MinGW, 2. wygooglać konwerter kodowania znaków w plikach i wcześniej zapisane pliki przekodować do UTF-8.

Jeśli Twoja aplikacja jest silnie okienkowa, zamiast rzeźbić nowe okna z palca w Win32, użyj jakiegoś gotowego toolsetu (albo połącz manged/unmanaged C++ w VS i użyj WinForms albo zainteresuj się wxWindows lub rowolnym innym frameworkiem, który będzie Ci odpowiadał).