Pentru a repeta cuvintele unui șir în codarea UTF8, trebuia să dau seama cum să găsesc octetul total al byte-ului în primul byte al personajului. Tocmai am început să mă ocup de UTF8, așa că nu înțeleg destul de bine mecanica operațiilor de biți, care este folosită în acest scop (judecând după majoritatea exemplelor de pe Internet).
Pe StackOverflow, am găsit două soluții:
2) A doua soluție este găsită aici. Utilizează o metodă diferită: în loc de o operație bit "lookup" este folosit pentru următoarea matrice de 256 de caractere:
Din păcate, nu am acum posibilitatea de a face bine cu UTF8, așa că doar în căutarea pentru o funcție de încredere, care-mi va da rezultatele corecte pentru caracterele codate în UTF8 (mai precis, pentru primul octet al caracterului). Îmi place mai mult a doua soluție, dar vreau să aud opinia specialiștilor mai experimentați:
ce functie ar trebui sa folosesc pentru aceasta sarcina: 1, 2 sau, poate, stiti o functie dovedita care este mai buna decat aceste doua?
P.S. Apropo, dacă cineva poate explica de unde a venit masa de căutare, voi fi recunoscător. Pe SO scriu că este luat din codul sursă gutf8.c al glib-ului. Deci, este interesant, care este principiul din spatele ei.
Aș sfătui să nu deranjez deloc cu UTF-8. Faceți acest lucru: 1. Fișierele conțin informații în UTF-8 (sau alte codificări). Când citiți de la acestea, transcodați imediat în UCS-2 (wchar_t *) sau dacă este necesar UCS-4, astfel încât lungimea fiecărui caracter să fie aceeași. 2. Lucrați numai cu informații cu caractere de lungime constantă de byte. 3. Când scrieți la un fișier, recode înapoi la utf-8 sau orice codificare este necesar. - VladD 24 februarie '14 la 13:12
@VladD, mulțumesc pentru vârf. Cu toate acestea, am dori a fost un pic mai complicat cu UTF-8, pentru a vedea modul în care iterație în conformitate cu (A-Za-Za-Ha-I) pe zbor, cu nici o codificare de conversie. - Stanislav Pankevich Februarie 24 '14 la 13:27
Pe scurt, algoritmul pentru codificarea caracterelor în UTF8 arată astfel:
- Dacă codul de caractere este mai mic de 128, atunci este codat ca este.
- Dacă este mai mare sau egală, apoi codificat în acest format: primul octet este scris numărul de octeți utilizate, inclusiv primul (adică, scris la un număr de unități într-un singur cod, cât de multe bytes, inclusiv, teoretic, UTF8 locuri de format fără restricții privind numărul de octeți utilizate pentru înregistrarea numărului de , dar de obicei nu mai mult de 6 sunt folosite). Apoi este scris 0 (pentru a separa numărul de octeți ai numărului de cifrele semnificative ale numărului), după care biții reprezentând numărul merg. Fiecare următor byte începe cu secvența 10 (pentru a nu confunda caracterele cu un singur octet și cu mai multe biblioteci - toate caracterele cu un singur byte încep de la zero).
- Primele 3 unități. prin urmare, 3 octeți sunt utilizați pentru scriere.
- Apoi 0. separarea numărului de octeți de număr
- În continuare sunt cifrele semnificative ale numărului. Primele 2 biți ale fiecărui octet (10) nu se referă la acestea - acestea sunt etichetele care înseamnă că acesta este al doilea (al treilea, etc.) octet al înregistrării.
Astfel, codul înregistrat este 0011011101000100. Aceasta se referă la locul unde a venit masa de căutare. Cu privire la întrebarea ce funcție trebuie utilizată - trecerea de la nevoi. Dacă lucrați întotdeauna cu caracterele al căror cod nu depășește 256, utilizați tabelul de căutare, este mai rapid. Dacă intenționați să sprijiniți pe deplin Unicode, utilizați funcția. Numai acesta va trebui modificat, deoarece nu recunoaște caracterele de 5 și 6 octeți.
Îmi cer scuze, expresia "tabelul de căutare" ma confundat și a cauzat asociații incorecte. Da, într-adevăr, acest tabel este conceput pentru a verifica primul octet al secvenței și decizia privind lungimea codului. Personal, am tendința de a funcționa - se pare mult laconică. Dar tabelul de căutare funcționează mai repede, dacă este important, este mai bine să o utilizați.
> Dacă lucrați întotdeauna cu caracterele al căror cod nu depășește 256, utilizați tabelul de căutare, este mai rapid. Dacă intenționați să sprijiniți pe deplin Unicode, utilizați funcția. Vă mulțumim pentru răspuns. Și de ce credeți că funcția nu funcționează cu caracterele Unicode? În opinia mea este doar proiectat pentru acest lucru, doar căutare este exact la fel ca primul octet. nu-i așa? În acea legătură, este folosit doar pentru a determina câți octeți 1, 2 sau 6 să copiați în prealabil. - Stanislav Pankevich 24 februarie 14 la 13:26
Vă rugăm să rețineți, exprimate funcția dvs. revine doar valorile 1, 2, 3 și 4, prin urmare, să definească un caracter de 6-byte, aceasta nu poate, în principiu, (va-l ia de 4-byte). - fori1ton 24 februarie '14 la 13:29