eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Jak efektywnie stwierdzić czy tekst jest w UTF8?
Ilość wypowiedzi w tym wątku: 9

  • 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

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: