<ru...@yahoo.com> wrote in message news:2ad21a79-4a6c-42a7-8923-beb304bb5...@v20g2000yqm.googlegroups.com...
In Python 2.5 on Windows I could do [*1]:

 # Create a unicode character outside of the BMP.
 >>> a = u'\U00010040'

 # On Windows it is represented as a surogate pair.
 >>> len(a)
 2
 >>> a[0],a[1]
 (u'\ud800', u'\udc40')

 # Create the same character with the unichr() function.
 >>> a = unichr (65600)
 >>> a[0],a[1]
 (u'\ud800', u'\udc40')

 # Although the unichr() function works fine, its
 # inverse, ord(), doesn't.
 >>> ord (a)
 TypeError: ord() expected a character, but string of length 2 found

On Python 2.6, unichr() was "fixed" (using the word
loosely) so that it too now fails with characters outside
the BMP.

 >>> a = unichr (65600)
 ValueError: unichr() arg not in range(0x10000) (narrow Python build)

Why was this done rather than changing ord() to accept a
surrogate pair?

Does not this effectively make unichr() and ord() useless
on Windows for all but a subset of unicode characters?

Switch to Python 3?

x='\U00010040'
import unicodedata
unicodedata.name(x)
'LINEAR B SYLLABLE B025 A2'
ord(x)
65600
hex(ord(x))
'0x10040'
unicodedata.name(chr(0x10040))
'LINEAR B SYLLABLE B025 A2'
ord(chr(0x10040))
65600
print(ascii(chr(0x10040)))
'\ud800\udc40'

-Mark


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to