Rozpoznawanie kodowania znaków

0

Witam.

Napisałem sobie mały program, którego celem jest przetwarzanie kodu źródłowego zapisanego w plikach .cpp i .h na kod html5 z kodowaniem UTF-8 wraz z kolorowaniem składni (jak ktoś chce może pobrać sobie go do testowania na mojej stronie obliczeniowo.jcom.pl/?id=378). Program napisałem w Dev C++ i kod źródłowy zapisany w tym kompilatorze działa cacy. I wszystko byłoby pięknie i wspaniale, gdyby nie fakt, że niektóre środowiska programistyczne najwyraźniej używają innego kodowania plików.

Koniec końców problem jest taki, że chciałbym w jakiś normalny sposób obsłużyć te pliki, tak aby polskie znaki jednak były poprawnie zapisywane a do tego potrzebuję rozpoznać w jakiś sposób z jakim typem kodowania mam do czynienia. I tu powstaje pytanie jak to zrobić? Czy jest jakaś funkcja, która testuje dany plik pod względem kodowania i poprawnie wczytuje tekst już w jednym konkretnym kodowaniu, czy też może nie ma i trzeba by sobie samemu taką funkcję testującą spróbować napisać?

0

Pod Windows istotne są właściwie dwa kodowania: tzw. ANSI, czyli aktualna systemowa strona kodowa, i UTF-8.

UTF-8 można poznać po sekwencji BOM na początku (trzy bajty: EF BB BF), a jeśli jej brak, możesz założyć że to ANSI (GetACP() ci zwróci jaka jest aktywna strona kodowa).

Problem powstaje, gdy plik jest w UTF-8 bez BOM (jak to linuksiarze lubią).
Możesz próbować zacząć dekodować plik jako UTF-8, a gdy natrafisz na nieprawidłową sekwencję bajtów (niepasującą do UTF-8), zaprzestać dekodowania i uznać że to ANSI.

Jako zadanie z gwiazdką możesz dodać UTF-16 (z BOM FF FE i bez) oraz stronę kodową OEM używaną w windowsowej konsoli (GetOEMCP()).
Odróżnienie zwłaszcza ANSI od OEM może być w niektórych przypadkach niemożliwe, więc i tak przydałaby się w programie możliwość wymuszenia konkretnego kodowania.

Ale zacznij od wariantu najprostszego: jest BOM -> UTF-8, nie ma - ANSI.

0

Dzięki za szybką odpowiedź.

Udało mi się ustalić, że większość plików z kodem źródłowym zapisywanych jest jednak w ASCII ale z innym kodowaniem niż to, z którego korzysta DEV C++, ale z tym jakoś sobie poradziłem. Udało mi się na podstawie BOOM rozpoznać plik UTF-8, niestety standardowe kodowanie używane w VS EE jest UNICODE, ale nie wiem jakie, wiem na pewno, że jeżeli jest to UTF-16 to bez BOOM bo mi nie udało się rozpoznać UTF-16 na podstawie informacji, którymi się ze mną podzieliłeś. Istnieje też możliwość, że jest to UTF-32. Wiem, że VS EE używa rozszerzonego kodowania jedynie wtedy, gdy w kodzie użyto znaków wykraczających poza zakres podstawowych znaków dostępnych w danym kodowaniu ASCII.

Czy mógłbyś mnie nakierować nieco jak wyglądałby taki test pliku pod względem wykrycia tych trzech typów kodowania. Jeżeli znasz jakąś dobrą stronkę z opisem tego zagadnienia to byłbym bardzo wdzięczny za podzielenie się linkiem. Rozumiem, że test polegał będzie na wykryciu takich znaków, które z pewnością dany typ kodowania nie powinien obsługiwać, pytanie tylko jakie są to znaki.

0

Obsłużyłem już UTF-8 z BOM oraz bez BOM, udało mi się obsłużyć w końcu UTF-16le i UTF-16ge identyfikowane za pomocą BOM, poprawiłem rozpoznanie ASCII z używanym 8-mym bajtem do kodowania (między innymi) polskich znaków, domyślnie jest używane kodowanie windows-1250, ale VS EE zapisuje w jakimś innym kodowaniu więc musiałem pobawić się w podmienianie literek.

Dzięki Azarien za podpowiedź, przydała się.

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