-
1. Data: 2012-06-13 00:09:18
Temat: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: "Borneq" <b...@a...hidden.pl>
Gdy mam stwierdzić w jakim kodowaniu jest tekst to wykorzystuję twierdzenie
Bayesa - na przykład mam klasy Win1250,Latin2 i CP852.
Trenuję najpierw na tekstach otrzymując tabelkę 256 częstotliwości
występowania.
Aby zbadać jakie jest prawdopodobieństwo że tekst jest w danej stronie
kodowej dla zadanej klasy mnożę dla każdego znaku prawdopodobieństwa że znak
należy do danej klasy. Aby nie wyszło zerowe, stosuję wygładzenie Laplace'a
w ten sposób że do licznika dodaję jedynkę a do mianownika ilość znaków,
których częstotliwość jest niezerowa przynajmniej w jednej klasie.
Można to stosować do UTF8, ale ten standard w odróżnieniu od tamtych kodowań
jeden znak może kodować kilkoma bajtami. Potrzebne jest sprawdzenie
działające już dla krótkich tekstów i nie tylko porównanie polskich tekstów,
ale odróżnienie UTF8 od innych kodowań niezależnie od języka.
Można wykorzystać budowę kodu: http://pl.wikipedia.org/wiki/UTF-8
A więc dla języków takich jak polski większość znaków to kody 7 bitowe. Gdy
ośmiobitowy to najczęściej postaci 110xxxxx po którym musi być 10xxxxxx
Jeden pomysł to sprawdzenie czy wszystko to się zgadza. Ale wystarczy jeden
mały błąd i tekst zostanie zaklasyfikowany jako nie UTF-8. Należałoby to
także zrobić statystycznie. Ale jak zrobić zależność od poprzedniego bajtu
aby nie robić tablicy wielkości 256^n, choćby 256^2 ale wielkość tablicy
była by niewielka coś 256 do 300 liczb?
-
2. Data: 2012-06-13 09:46:39
Temat: Re: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: "Borneq" <b...@a...hidden.pl>
Użytkownik "Borneq" <b...@a...hidden.pl> napisał w wiadomości
news:jr8els$en3$1@inews.gazeta.pl...
> Trenuję najpierw na tekstach otrzymując tabelkę 256 częstotliwości
Metoda zliczań częstotliwości jest bezradna gdy mamy stwierdzić czy tekst
jest w Unicode czy też w Uniocode z odwróceniem bajtów. Wtedy potrzebne
byłyby dwie tabelki - dla parzystych i nieparzystych bajtów. Ale przyjmijmy
że nie rozpoznajemy Unicode 16-bitowego lecz UTF-8.
Wtedy zamiast częstotliwości 256 znaków będziemy mieli częstotliwość 7-mio
bitowych i 8-io bitowych. Oba dzielą się na wystąpienia po 7-mio lub 8-io
bitowym znaku.
Ośmiobitowe należałoby podzielić na:
10xxxxxx
110xxxxx
1110xxxx
11110xxx
111110xx
1111110x
razem z 0xxxxxxx i 1111111x będzie 8 klas.
Czyli 64 gdy mamy wystąpienie po jakimś znaku. Choć to nie całkiem bo po
1111110x powinno być aż 5 razy 10xxxxxx
-
3. Data: 2012-06-13 13:19:34
Temat: Re: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: Paweł Kierski <n...@p...net>
W dniu 2012-06-13 09:46, Borneq pisze:
> Użytkownik "Borneq" <b...@a...hidden.pl> napisał w wiadomości
> news:jr8els$en3$1@inews.gazeta.pl...
>> Trenuję najpierw na tekstach otrzymując tabelkę 256 częstotliwości
> Metoda zliczań częstotliwości jest bezradna gdy mamy stwierdzić czy
> tekst jest w Unicode czy też w Uniocode z odwróceniem bajtów. Wtedy
> potrzebne byłyby dwie tabelki - dla parzystych i nieparzystych bajtów.
> Ale przyjmijmy że nie rozpoznajemy Unicode 16-bitowego lecz UTF-8.
> Wtedy zamiast częstotliwości 256 znaków będziemy mieli częstotliwość
> 7-mio bitowych i 8-io bitowych. Oba dzielą się na wystąpienia po 7-mio
> lub 8-io bitowym znaku.
> Ośmiobitowe należałoby podzielić na:
> 10xxxxxx
> 110xxxxx
> 1110xxxx
> 11110xxx
> 111110xx
> 1111110x
> razem z 0xxxxxxx i 1111111x będzie 8 klas.
> Czyli 64 gdy mamy wystąpienie po jakimś znaku. Choć to nie całkiem bo po
> 1111110x powinno być aż 5 razy 10xxxxxx
W aktualnym zestawie UNICODE nie ma code pointów o numerach, które
wymagają kodowania na więcej niż 4 bajtach w UTF-8. Wystarczą tylko
pierwsze 3 klasy.
--
Paweł Kierski
n...@p...net
-
4. Data: 2012-06-13 14:18:45
Temat: Re: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: voy <v...@M...pl>
W dniu 2012-06-13 09:46, Borneq pisze:
> Użytkownik "Borneq" <b...@a...hidden.pl> napisał w wiadomości
> news:jr8els$en3$1@inews.gazeta.pl...
>> Trenuję najpierw na tekstach otrzymując tabelkę 256 częstotliwości
> Metoda zliczań częstotliwości jest bezradna gdy mamy stwierdzić czy
> tekst jest w Unicode czy też w Uniocode z odwróceniem bajtów. Wtedy...
Nie wiem czy coś pomogę (MSDN): IsTextUnicode
jeżeli na to jeszcze nie trafiłeś.
Pozdr :)
-
5. Data: 2012-06-13 14:44:32
Temat: Re: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: "Borneq" <b...@a...hidden.pl>
Użytkownik "voy" <v...@M...pl> napisał w wiadomości
news:jra0fe$73d$1@inews.gazeta.pl...
> Nie wiem czy coś pomogę (MSDN): IsTextUnicode
> jeżeli na to jeszcze nie trafiłeś.
Dla ostatniego parametru = nil, podaje czy jest Unicode, ale przydała by się
jeszcze metoda dla UTF8. Metoda statystyczna wykrywa czy jest to np. polski
tekst w UTF8 czy też rosyjski w UTF8. Nie dało rady połączyć klas aby
odpowiadał na pytanie: czy jakikolwiek UTF8 czy jakikolwiek inny. Dlatego że
w rosyjskim jest dużo więcej ośmiobitowych. Może trzeba użyć precyzyjnej
metody, ale tu problem gdy akurat w nie UTF8 będą znaki akurat taki jak
UTF8.
-
6. Data: 2012-06-13 20:31:18
Temat: Re: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: "Jordan Szubert" <u...@j...us.to>
Dnia 13-06-2012 o 00:09:18 Borneq <b...@a...hidden.pl> napisał(a):
[8<]
jeżeli jest legalnym UTF-8, to przyjmij że jest UTF8, jak dekodowanie
UTF-8 daje błędy, to to nie jest UTF-8
jak się zaczyna od BOM, to jeszcze bardziej jest
--
Jordan Szubert
-
7. Data: 2012-06-13 23:59:42
Temat: Re: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: "Borneq" <b...@a...hidden.pl>
Użytkownik "Jordan Szubert" <u...@j...us.to> napisał w wiadomości
news:op.wfutqgmdhilul8@asus7p.home...
> jeżeli jest legalnym UTF-8, to przyjmij że jest UTF8, jak dekodowanie
> UTF-8 daje błędy, to to nie jest UTF-8
> jak się zaczyna od BOM, to jeszcze bardziej jest
Dobrze działa precyzyjna (nie statystyczna) metoda. Tylko teraz sprawdzam
cały tekst, w jaki sposób można się ograniczyć np. do 100 znaków, kiedy
zakończenie wypadnie wewnątrz ciągu bajtów oznaczającego jeden znak Unicode?
Teraz gdy podam długość Len i ciąg się nie zakończy, przyjumje że jest
koniec pliku i zwraca że to nie jest UTF8.
Pozdrawiam
-
8. Data: 2012-06-14 01:09:35
Temat: Re: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: "Jordan Szubert" <u...@j...us.to>
Dnia 13-06-2012 o 23:59:42 Borneq <b...@a...hidden.pl> napisał(a):
> Użytkownik "Jordan Szubert" <u...@j...us.to> napisał w wiadomości
> news:op.wfutqgmdhilul8@asus7p.home...
>> jeżeli jest legalnym UTF-8, to przyjmij że jest UTF8, jak dekodowanie
>> UTF-8 daje błędy, to to nie jest UTF-8
>> jak się zaczyna od BOM, to jeszcze bardziej jest
>
> Dobrze działa precyzyjna (nie statystyczna) metoda. Tylko teraz
> sprawdzam cały tekst, w jaki sposób można się ograniczyć np. do 100
> znaków, kiedy zakończenie wypadnie wewnątrz ciągu bajtów oznaczającego
> jeden znak Unicode? Teraz gdy podam długość Len i ciąg się nie zakończy,
> przyjumje że jest koniec pliku i zwraca że to nie jest UTF8.
to chyba będziesz musiał napisać sobie sprawdzarkę, która ma przekazywane
dwie długości: ile ma tekst i jak długi prefix sprawdzać...
--
Jordan Szubert
-
9. Data: 2012-06-14 11:05:54
Temat: Re: Jak efektywnie stwierdzić czy tekst jest w UTF8?
Od: "Borneq" <b...@a...hidden.pl>
Użytkownik "Jordan Szubert" <u...@j...us.to> napisał w wiadomości
news:op.wfu6l9dnhilul8@asus7p.home...
> to chyba będziesz musiał napisać sobie sprawdzarkę, która ma przekazywane
> dwie długości: ile ma tekst i jak długi prefix sprawdzać...
Na razie sprawdza całość, ponieważ
- początek może być w UTF8 a reszta się nie przekonwertuje
- początek zawiera tylko siedmiobitowe znaki a reszta w UTF8