2010-02-23 20 views
9

Jeśli mam tablicę bajtów, która zawiera treść UTF8, w jaki sposób mam zamiar parsować ją? Czy istnieją oddzielne bajty, które można oddzielić, aby uzyskać każdą postać?Czy istnieją znaki ograniczające dla znaków UTF8?

+0

Uważaj na zniekształcone dane wejściowe, upewnij się, że Twój kod nie robi czegoś złego, jak przepełnienie bufora, jeśli sekwencja ma na przykład więcej niż 4 bajty. –

+0

Po wykonaniu wymaganego wybierania bitów, otrzymasz kilka znaków od 1 do 4 bajtów; co zamierzasz z tym zrobić? Dlaczego po prostu nie rozszyfrujesz go i nie będziesz pracował nad otrzymanymi znakami Unicode? –

+0

@JohnMachin w moim przypadku "pęczek znaków" jest zbyt duży, aby można go było przetworzyć za jednym razem, a mój kod wyszukuje bezpieczny offset bajtowy, aby podzielić dane na mniejsze porcje, z którymi można pracować indywidualnie. –

Odpowiedz

13

Spójrz tutaj ...

http://en.wikipedia.org/wiki/UTF-8

Jeśli szukasz zidentyfikować granicę między znakami, co potrzebne jest w tabeli w „Opis”.

Jedynym sposobem uzyskania wysokiego punktu zerowego jest podzbiór ASCII 0..127, zakodowany w jednym bajcie. Wszystkie punkty kodowe inne niż ASCII mają 2 bajty i "10" w najwyższych dwóch bitach. Główny bajt kodepointa nigdy tego nie ma - to wysokie bity wskazują na liczbę bajtów, ale jest trochę nadmiarowości - można równie uważać na następny bajt, który nie ma "10", aby wskazać następny kod.

0xxxxxxx : ASCII 
10xxxxxx : 2nd, 3rd or 4th byte of code 
11xxxxxx : 1st byte of code, further high bits indicating number of bytes 

Kod w unicode niekoniecznie musi być taki sam jak znak. Istnieją na przykład kody punktów modyfikujących (takie jak akcenty).

+0

Co z sekwencjami zmian emoji? Na przykład, jeśli znak 'U + 1F469' (w binarnym' 11110000 10011111 10010001 10101001') jest ustawiony osobno, otrzymujesz emotikon "kobieta". Jeśli jednak po nim występuje 'U + 1F3FD' (w binarnym' 11110000 10011111 10001111 10111101') to będzie to kobieta z brązową skórą. W jaki sposób można bezpiecznie wykryć tę granicę, aby uniknąć przerwania utf-8 bajtów pomiędzy tymi dwoma? Obydwa punkty kodowe są ważne same w sobie (te ostatnie są renderowane jako brązowy kwadrat na OS X), ale użytkownicy nie będą oczekiwać, że zostaną podzieleni. –

+0

@AbhiBeckert - myślisz o niewłaściwej warstwie. UTF-8 nie definiuje ani nie dba o to, w jaki sposób sekwencje punktów kodowych Unicode odnoszą się do siebie. Najpierw tłumaczymy kodowanie UTF-8 (lub inne kodowanie) do strumienia kodowego Unicode, a następnie interpretujemy to. Nie znam szczegółów specyficznych dla Unicode, ale ogólne podejście do problemu obsługi punktów kodowych modyfikatorów jest takie samo, jak rozpoznawanie słów kluczowych i innych tokenów w tokenizerze języka programowania. Prawdopodobnie istnieje lepszy sposób działania w Unicode, ale nie wiem, w każdym razie powinieneś zadać osobne pytanie. – Steve314

+0

Próbuję zidentyfikować "granicę między znakami", gdzie "znak" jest pojedynczym glifem narysowanym na ekranie, co jest dokładnie tym, na co odpowiadasz, o ile widzę.Rozdzielam dużą (potencjalnie gigabajtową) ilość danych utf-8 na mniejsze kawałki (o długości dziesiątek bajtów), które są rysowane na ekranie osobno, a to rozejdzie się w milczeniu, jeśli bajty zostaną rozdzielone w sposób sugerowany w twoim odpowiedź. –

0

Bajty, dla których pierwszy bit ustawiony jest na 0, są normalnymi znakami ASCII. Bajty, których pierwszy bit jest ustawiony na 1, są częścią znaku UTF-8.

Pierwszy bajt w każdym znaku UTF-8 ma drugi bit ustawiony na 1, więc bajt ma najbardziej znaczące bity 11. Każdy kolejny bajt należący do tego samego znaku UTF-8 zaczyna się od 10.

Pierwszy bajt każdego znaku UTF-8 dodatkowo wskazuje, ile z poniższych bajtów należy do znaku, w zależności od liczby bitów ustawionych na 1 w najbardziej znaczących bitach tego bajtu.

Aby uzyskać więcej informacji, patrz Wikipedia page dla UTF-8.

+0

"Znak UTF-8" jest mylący. Wydaje się, że odnosisz się do sekwencji od dwóch do czterech bajtów, która reprezentuje znak spoza ASCII. Jeśli chodzi o zrozumienie Unicode, uważam, że poprawne słownictwo to połowa sukcesu. –

Powiązane problemy