2011-09-23 22 views
5

Biorąc ciąg znaków w postaci wskaźnika do tablicy bajtów (znaków), w jaki sposób mogę wykryć kodowanie ciągu znaków w C/C++ (użyłem visual studio 2008)? ? Zrobiłem wyszukiwanie, ale większość próbek jest wykonywana w języku C#.Wykrywanie kodowania ciągu znaków w C/C++

Dzięki

+0

Czy to tylko ANSI vs UCS2? –

+0

Jakie są możliwe kodowania, których można się spodziewać? Czy istnieje niewielka kolekcja możliwych, czy może to tylko jedna? –

+0

Z jakiego środowiska korzystasz? Myślę, że istnieje biblioteka do wykonania tego w Linuksie, która jest przenośna dla Windows. –

Odpowiedz

6

Zakładając, że wiemy, że długość tablicy wejściowej, można wprowadzić następujące przypuszczenia:

  1. Po pierwsze, sprawdź, czy pierwsze kilka bajtów odpowiada żadnemu dobrze wiedzieć byte order marks (BOM) for Unicode. Jeśli tak, to koniec!
  2. Następnie wyszukaj '\ 0' przed ostatnim bajtem. Jeśli znajdziesz taki, możesz mieć do czynienia z UTF-16 lub UTF-32. Jeśli znajdziesz wiele kolejnych \ '-ów, prawdopodobnie jest to UTF-32.
  3. Jeśli jakikolwiek znak jest od 0x80 do 0xff, to na pewno nie jest ASCII ani UTF-7. Jeśli ograniczasz wejście do jakiegoś wariantu Unicode, możesz założyć, że jest to UTF-8. W przeciwnym razie musisz zgadnąć, które z nich jest multi-byte character set. To nie będzie zabawne.
  4. W tym miejscu jest to: ASCII, UTF-7, Base64 lub zakresy UTF-16 lub UTF-32, które po prostu nie używają górnego bitu i nie mają żadnych pustych znaków.
3

To nie jest łatwy do rozwiązania problemem, i generalnie opiera się na heurystykę wziąć najlepszy przypuszczenie na co kodowanie wejściowego, który może zostać zablokowany przez wejść stosunkowo nieszkodliwe - na przykład przyjrzeć this Wikipedia article i The Notepad file encoding Redux, aby uzyskać więcej informacji.

Jeśli szukasz rozwiązania tylko dla systemu Windows z minimalnymi zależnościami, możesz skorzystać z kombinacji IsTextUnicode i MLang's DetectInputCodePage, aby spróbować wykryć zestaw znaków.

Jeśli szukasz przenośności, ale nie przejmuj się zbytnio dużą zależnością w postaci ICU, możesz skorzystać z jej procedur, aby osiągnąć ten sam cel w przenośny sposób.