pythonunicodepython-3.x

chr() equivalent returning a bytes object, in py3k


Python 2.x has chr(), which converts a number in the range 0-255 to a byte string with one character with that numeric value, and unichr(), which converts a number in the range 0-0x10FFFF to a Unicode string with one character with that Unicode codepoint. Python 3.x replaces unichr() with chr(), in keeping with its "Unicode strings are default" policy, but I can't find anything that does exactly what the old chr() did. The 2to3 utility (from 2.6) leaves chr calls alone, which is not right in general :(

(This is for parsing and serializing a file format which is explicitly defined in terms of 8-bit bytes.)


Solution

  • Consider using bytearray((255,)) which works the same in Python2 and Python3. In both Python generations the resulting bytearray-object can be converted to a bytes(obj) which is an alias for a str() in Python2 and real bytes() in Python3.

    # Python2
    >>> x = bytearray((32,33))
    >>> x
    bytearray(b' !')
    >>> bytes(x)
    ' !'
    
    # Python3
    >>> x = bytearray((32,33))
    >>> x
    bytearray(b' !')
    >>> bytes(x)
    b' !'