1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
"""
Helpers to pack and unpack a unicode character into raw bytes.
"""
import sys
from rpython.rlib.runicode import MAXUNICODE
if MAXUNICODE <= 65535:
UNICODE_SIZE = 2
else:
UNICODE_SIZE = 4
BIGENDIAN = sys.byteorder == "big"
def pack_unichar(unich, charlist):
if UNICODE_SIZE == 2:
if BIGENDIAN:
charlist.append(chr(ord(unich) >> 8))
charlist.append(chr(ord(unich) & 0xFF))
else:
charlist.append(chr(ord(unich) & 0xFF))
charlist.append(chr(ord(unich) >> 8))
else:
if BIGENDIAN:
charlist.append(chr(ord(unich) >> 24))
charlist.append(chr((ord(unich) >> 16) & 0xFF))
charlist.append(chr((ord(unich) >> 8) & 0xFF))
charlist.append(chr(ord(unich) & 0xFF))
else:
charlist.append(chr(ord(unich) & 0xFF))
charlist.append(chr((ord(unich) >> 8) & 0xFF))
charlist.append(chr((ord(unich) >> 16) & 0xFF))
charlist.append(chr(ord(unich) >> 24))
def unpack_unichar(rawstring):
assert len(rawstring) == UNICODE_SIZE
if UNICODE_SIZE == 2:
if BIGENDIAN:
n = (ord(rawstring[0]) << 8 |
ord(rawstring[1]))
else:
n = (ord(rawstring[0]) |
ord(rawstring[1]) << 8)
else:
if BIGENDIAN:
n = (ord(rawstring[0]) << 24 |
ord(rawstring[1]) << 16 |
ord(rawstring[2]) << 8 |
ord(rawstring[3]))
else:
n = (ord(rawstring[0]) |
ord(rawstring[1]) << 8 |
ord(rawstring[2]) << 16 |
ord(rawstring[3]) << 24)
return unichr(n)
|