On Py2.x u'%c' % char returns the wrong result if char is in range '\x80'-'\xFF':
>>> u'%c' % '\x7f'
u'\x7f' # correct
>>> u'%c' % '\x80'
u'\uff80' # broken
>>> u'%c' % '\xFF'
u'\uffff' # broken
This is what happens whit %s and 0x80:
>>> u'%s' % '\x80'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal
not in range(128)
>>> u'%c' % 0x80
u'\x80'
u'%c' % '\x80' should raise the same error raised by u'%s' % '\x80'.