Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / CHARSET / CharUTF8Size

Zdrojový kód: INCLUDE\UTIL\CHARSET.INC, UTIL\CHARSET.ASM


CharUTF8Size - Zjištění velikosti znaku v kódu UTF-8

Funkce CharUTF8Size navrátí velikost znaku v kódu UTF-8.


; -----------------------------------------------------------------------------
;                      Get size of UTF-8 character
; -----------------------------------------------------------------------------
; INPUT:	EAX = Unicode character (max. 31 bits)
;		EDI = data counter
; OUTPUT:	EDI = next data counter
; DESTROYS:	EAX
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EAX Unicode kód znaku a registr EDI čítač velikosti dat. Na výstupu funkce je čítač v registru EDI zvýšení o velikost dat, která by znak zabral ve výstupním bufferu. Obsah registru EAX je funkcí zničen.


; ------------- 1 Byte (7 bits, 0xxxxxxx = 0..7F)

CharUTF8Size:	inc	edi		; increase data counter
		cmp	eax,byte 7fh	; check character (7 bits)
		ja	CharUTF8Size1	; character has more bytes
		ret

; ------------- 2 Bytes (11 bits), 3 Bytes and more bytes

CharUTF8Size1:	bsr	eax,eax		; EAX <- highest bit position (7..30)
		mov	ah,51		; AH <- divisor 256/5
		imul	ah		; AH <- character length
		movzx	eax,ah		; EAX <- character length
		add	edi,eax		; increase data counter
		ret

Nejdříve je obsloužen nejjednodušší případ - znaky s kódem 0 až 7Fh zabírají 1 bajt, proto je zvýšen čítač dat o 1.

Pro znaky s vyšším kódem je počet bajtů počítán tak, že v kódu znaku je vyhledána pozice nejvyššího bitu a tato pozice je vynásobena číslem 51 a poté vydělena 256 (tj. je použit vyšší bajt výsledku násobení v registru AH), což přibližně odpovídá dělení 5. Tento výpočet se shoduje s počtem bajtů znaku v rozsahu 8 až 31 bitů.


Obsah / Utility / CHARSET / CharUTF8Size