PEP 393 vs UTF-8 Everywhere

eryk sun eryksun at gmail.com
Sat Jan 21 15:49:26 EST 2017


On Sat, Jan 21, 2017 at 8:21 PM, Pete Forman <petef4+usenet at gmail.com> wrote:
> Marko Rauhamaa <marko at pacujo.net> writes:
>>>> py> low = '\uDC37'
>>>> That should raise a SyntaxError exception.
>> Quite. My point was that with older Python on a narrow build (Windows
> and Mac) you need to understand that you are using UTF-16 rather than
> Unicode. On a wide build or Python 3.3+ then all is rosy. (At this point
> I'm tempted to put in a winky emoji but that might push the internal
> representation into UCS-4.)

CPython allows surrogate codes for use with the "surrogateescape" and
"surrogatepass" error handlers, which are used for POSIX and Windows
file-system encoding, respectively. Maybe MicroPython goes about the
file-system round-trip problem differently, or maybe it just require
using bytes for file-system and environment-variable names on POSIX
and doesn't care about Windows.
"surrogateescape" allows 'decoding' arbitrary bytes:
 >>> b'\x81'.decode('ascii', 'surrogateescape')
 '\udc81'
 >>> '\udc81'.encode('ascii', 'surrogateescape')
 b'\x81'
This error handler is required by CPython on POSIX to handle arbitrary
bytes in file-system paths. For example, when running with LANG=C:
 >>> sys.getfilesystemencoding()
 'ascii'
 >>> os.listdir(b'.')
 [b'\x81']
 >>> os.listdir('.')
 ['\udc81']
"surrogatepass" allows encoding surrogates:
 >>> '\udc81'.encode('utf-8', 'surrogatepass')
 b'\xed\xb2\x81'
 >>> b'\xed\xb2\x81'.decode('utf-8', 'surrogatepass')
 '\udc81'
This error handler is used by CPython 3.6+ to encode Windows UCS-2
file-system paths as WTF-8 (Wobbly). For example:
 >>> os.listdir('.')
 ['\udc81']
 >>> os.listdir(b'.')
 [b'\xed\xb2\x81']


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /