diff Python/bltinmodule.c @ 43216:a311ab2fc1a7

Decode input() with stdin.encoding. Fixes #1097.
author Martin v. Löwis <martin@v.loewis.de>
date Tue, 04 Sep 2007 05:24:49 +0000
parents d842457e4b0e
children 8c10aac37037
line wrap: on
line diff
--- a/Python/bltinmodule.c	Tue Sep 04 02:52:00 2007 +0000
+++ b/Python/bltinmodule.c	Tue Sep 04 05:24:49 2007 +0000
@@ -1314,7 +1314,14 @@
 		PyObject *po;
 		char *prompt;
 		char *s;
+		PyObject *stdin_encoding;
 		PyObject *result;
+
+		stdin_encoding = PyObject_GetAttrString(fin, "encoding");
+		if (!stdin_encoding)
+			/* stdin is a text stream, so it must have an
+			   encoding. */
+			return NULL;
 		tmp = PyObject_CallMethod(fout, "flush", "");
 		if (tmp == NULL)
 			PyErr_Clear();
@@ -1322,10 +1329,13 @@
 			Py_DECREF(tmp);
 		if (promptarg != NULL) {
 			po = PyObject_Str(promptarg);
-			if (po == NULL)
+			if (po == NULL) {
+				Py_DECREF(stdin_encoding);
 				return NULL;
+			}
 			prompt = PyString_AsString(po);
 			if (prompt == NULL) {
+				Py_DECREF(stdin_encoding);
 				Py_DECREF(po);
 				return NULL;
 			}
@@ -1339,6 +1349,7 @@
 		if (s == NULL) {
 			if (!PyErr_Occurred())
 				PyErr_SetNone(PyExc_KeyboardInterrupt);
+			Py_DECREF(stdin_encoding);
 			return NULL;
 		}
 		if (*s == '\0') {
@@ -1353,9 +1364,13 @@
 				result = NULL;
 			}
 			else {
-				result = PyUnicode_FromStringAndSize(s, len-1);
+				result = PyUnicode_Decode
+					(s, len-1,
+					 PyUnicode_AsString(stdin_encoding),
+					 NULL);
 			}
 		}
+		Py_DECREF(stdin_encoding);
 		PyMem_FREE(s);
 		return result;
 	}