summaryrefslogtreecommitdiffstats
path: root/Modules/_tkinter.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_tkinter.c')
-rw-r--r--Modules/_tkinter.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 22850a4..a42b782 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -770,8 +770,33 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
PyObject *result = NULL;
TkappObject *app = (TkappObject*)tkapp;
- if (value->typePtr == NULL)
- return PyString_FromStringAndSize(value->bytes, value->length);
+ if (value->typePtr == NULL) {
+ /* If the result contains any bytes with the top bit set,
+ it's UTF-8 and we should decode it to Unicode */
+#ifdef Py_USING_UNICODE
+ int i;
+ char *s = value->bytes;
+ int len = value->length;
+ for (i = 0; i < len; i++) {
+ if (value->bytes[i] & 0x80)
+ break;
+ }
+
+ if (i == value->length)
+ result = PyString_FromStringAndSize(s, len);
+ else {
+ /* Convert UTF-8 to Unicode string */
+ result = PyUnicode_DecodeUTF8(s, len, "strict");
+ if (result == NULL) {
+ PyErr_Clear();
+ result = PyString_FromStringAndSize(s, len);
+ }
+ }
+#else
+ res = PyString_FromStringAndSize(value->bytes, value->length);
+#endif
+ return result;
+ }
if (value->typePtr == app->BooleanType) {
result = value->internalRep.longValue ? Py_True : Py_False;