Programmering: hur du identifierar och läsa UTF-8-tecken i text snören... (13 / 16 steg)
utf8 pekar på en byte i en textsträng / / Uni poäng till en variabel som kommer att lagra Unicode / / returnerar funktionen hur många byte har varit readint UTF8_to_Unicode (char * utf8, unsigned int * Uni) {om (utf8 == NULL) returnera 0; om (Uni == NULL) return 0; / / U-00000000 - U-0000007F / / ASCII-kod? om (* utf8 > = 0) {* Uni = * utf8; återvända 1;} int len = 0; unsigned char * u = (unsigned char *) utf8; * Uni = 0; / / U-00000080 - U-000007FF : 110xxxxx 10xxxxxx om ((u [0] & 0xE0) == 0xC0) {len = 2; * Uni = u [0] & 0x1F;} annat / / U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx om ((u [0] & 0xF0) == 0xE0) {len = 3; * Uni = u [0] & 0x0F;} annat / / U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx om ((u [0] & 0xF8) == 0xF0) {len = 4; * Uni = u [0] & 0x07;} annat {/ / vår UTF-8 karaktär är missbildad / / låt oss tillbaka det som en utökad ASCII * Uni = u [0]; return 1;} / / ska vi läsa följande byte int a; för (en = 1; en < len; a ++) {om ((u [a] > = 0) || ((u [a] & 0xC0)! = 0x80)) {/ / vår UTF-8-kod är felaktigt... / / Låt oss tillbaka det som en utökad ASCII * Uni = u [0]; return 1.} hittills verkar allt Ok. Vi bygger säkert våra Unicode * Uni = (* Uni << 6) | (u [a] & 0x3F); } / / Enligt Unicode 5.0 / / koder i intervallet 0xD800 till 0xDFFF / / tillåts inte. om (((* Uni) > = 0xD800) || ((*Uni) < = 0xDFFF)) {/ / I det här fallet vår UTF-8-kod bildades väl. / / så, eller vi dela den i 2 utökade ASCII-koder, / / eller vi Visa en annan symbol i stället... / / vi ska läsa boken för Unicode 5.0 att / / veta deras officiella rekommendationer ändå... * Uni = '?'; tillbaka 1.} Det är gjort! * Uni innehåller våra unicode. vi helt enkelt tillbaka hur många byte / / det var lagrade i. tillbaka len;}