]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
more unicode tweaks: make unichr(0xdddddddd) behave like u"\Udddddddd"
authorFredrik Lundh <fredrik@pythonware.com>
Tue, 26 Jun 2001 20:01:56 +0000 (20:01 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Tue, 26 Jun 2001 20:01:56 +0000 (20:01 +0000)
wrt surrogates.  (this extends the valid range from 65535 to 1114111)

Python/bltinmodule.c

index 4da984f8da48333a268a1a0e88ee1a5b49224355..ed5519f257481e0a526447eded6fd5198b635a39 100644 (file)
@@ -308,23 +308,34 @@ static PyObject *
 builtin_unichr(PyObject *self, PyObject *args)
 {
        long x;
-       Py_UNICODE s[1];
+       Py_UNICODE s[2];
 
        if (!PyArg_ParseTuple(args, "l:unichr", &x))
                return NULL;
-       if (x < 0 || x >= 65536) {
+
+       if (x < 0 || x > 0x10ffff) {
                PyErr_SetString(PyExc_ValueError,
-                               "unichr() arg not in range(65536)");
+                               "unichr() arg not in range(0x10ffff)");
                return NULL;
        }
-       s[0] = (Py_UNICODE)x;
-       return PyUnicode_FromUnicode(s, 1);
+
+       if (x <= 0xffff) {
+               /* UCS-2 character */
+               s[0] = (Py_UNICODE) x;
+               return PyUnicode_FromUnicode(s, 1);
+       } else {
+               /* UCS-4 character.  store as two surrogate characters */
+               x -= 0x10000L;
+               s[0] = 0xD800 + (Py_UNICODE) (x >> 10);
+               s[1] = 0xDC00 + (Py_UNICODE) (x & 0x03FF);
+               return PyUnicode_FromUnicode(s, 2);
+       }
 }
 
 static char unichr_doc[] =
 "unichr(i) -> Unicode character\n\
 \n\
-Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
+Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.";
 
 
 static PyObject *