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

Obsah / Utility / CHARSET / CharToUnicode

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


CharToUnicode - Konverze znaku na Unicode

Funkce CharToUnicode zkonvertuje 1-bajtový znak z příslušné znakové sady na kód Uicode.


; -----------------------------------------------------------------------------
;                        Convert character to Unicode
; -----------------------------------------------------------------------------
; INPUT:	AL = single byte character (0 to 255)
;		EBX = character set structure CHARSET (only singlebyte allowed)
;		EDX = invalid character (in Unicode, 0 = default character)
; OUTPUT:	EAX = Unicode character (EAX <- EDX on error)
;		CY = invalid character (EAX <- EDX on error)
; NOTES:	Character set must be singlebyte.
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr AL 1-bajtový znak ke konverzi, registr EBX ukazatel na znakovou sadu CHARSET a registr EDX Unicode kód znaku, který se použije v případě neplatnosti konvertovaného znaku. Je povolena pouze 1-bajtová znaková sada (není funkcí kontrolováno). Na výstupu z funkce je v registru EAX navrácen Unicode kód znaku (nebo neplatný kód z registru EDX, pokud nejsou k dispozici další data) a v případě chyby příznak chyby CY.


; ------------- Characters 0 to 7fh have the same Unicode code

CharToUnicode:	movzx	eax,al		; EAX <- character
		cmp	al,7fh		; ASCII page?
		ja	CharToUnicode4	; not ASCII page
		clc			; clear error flag
		ret

Jedná-li se o znak s kódem 0 až 7Fh, je funkce ukončena bez dalších operací, protože znaky s tímto kódem jsou ve všech znakových sadách shodné s kódem Unicode a není tedy nutný jejich převod.


; ------------- Convert character and check character validity

CharToUnicode4:	push	ecx		; push ECX
		mov	ecx,[ebx+CHSET_ToUni] ; ECX <- table to Unicode
		mov	ax,[ecx+eax*2-128*2] ; EAX <- Unicode code
		pop	ecx		; pop ECX
		or	eax,eax		; invalid character (0 value)?
		jz	CharToUnicode8	; invalid character
		ret

Pro znaky s kódem 80h až 0FFh je z popisovače CHARSET načten ukazatel na tabulku pro převod znaků na Unicode a z ní je načten odpovídající Unicode kód znaku. Pokud je daný znak neplatný (tj. jeho hodnota je 0), navrátí se chybový kód.


; ------------- ERROR: Invalid character

CharToUnicode8:	mov	eax,edx		; EAX <- invalid character
		or	eax,eax		; default character?
		jnz	CharToUnicode9	; no default character
		mov	al,UNINOASC	; use default character
CharToUnicode9:	stc			; set error flag
		ret

Pro neplatný znak navrátí funkce obsah registru EDX s kódem neplatného znaku nebo, je-li obsah registru EDX nulový, implicitní neplatný znak UNINOASC.


Obsah / Utility / CHARSET / CharToUnicode