Use unicode
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index a1a2c51..30ba461 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -316,7 +316,7 @@
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	return PyString_FromString(descr->d_method->ml_doc);
+	return PyUnicode_FromString(descr->d_method->ml_doc);
 }
 
 static PyMemberDef descr_members[] = {
@@ -337,7 +337,7 @@
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	return PyString_FromString(descr->d_member->doc);
+	return PyUnicode_FromString(descr->d_member->doc);
 }
 
 static PyGetSetDef member_getset[] = {
@@ -352,7 +352,7 @@
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	return PyString_FromString(descr->d_getset->doc);
+	return PyUnicode_FromString(descr->d_getset->doc);
 }
 
 static PyGetSetDef getset_getset[] = {
@@ -367,7 +367,7 @@
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	return PyString_FromString(descr->d_base->doc);
+	return PyUnicode_FromString(descr->d_base->doc);
 }
 
 static PyGetSetDef wrapperdescr_getset[] = {
@@ -936,22 +936,22 @@
 static PyObject *
 wrapper_name(wrapperobject *wp)
 {
-	char *s = wp->descr->d_base->name;
+	const char *s = wp->descr->d_base->name;
 
-	return PyString_FromString(s);
+	return PyUnicode_FromString(s);
 }
 
 static PyObject *
 wrapper_doc(wrapperobject *wp)
 {
-	char *s = wp->descr->d_base->doc;
+	const char *s = wp->descr->d_base->doc;
 
 	if (s == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
 	else {
-		return PyString_FromString(s);
+		return PyUnicode_FromString(s);
 	}
 }
 
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 4e5e09d..6ea8e1d 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -343,7 +343,7 @@
 {
 	PyObject *result;
 	if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL)
-		return PyString_FromString(type->tp_doc);
+		return PyUnicode_FromString(type->tp_doc);
 	result = PyDict_GetItemString(type->tp_dict, "__doc__");
 	if (result == NULL) {
 		result = Py_None;
@@ -1918,15 +1918,30 @@
 	*/
 	{
 		PyObject *doc = PyDict_GetItemString(dict, "__doc__");
-		if (doc != NULL && PyString_Check(doc)) {
-			const size_t n = (size_t)PyString_GET_SIZE(doc);
-			char *tp_doc = (char *)PyObject_MALLOC(n+1);
-			if (tp_doc == NULL) {
-				Py_DECREF(type);
-				return NULL;
+		if (doc != NULL) {
+			char *tp_doc;
+			const char *str = NULL;
+			size_t n;
+			if (PyString_Check(doc)) {
+				str = PyString_AS_STRING(doc);
+				n = (size_t)PyString_GET_SIZE(doc);
+			} else if (PyUnicode_Check(doc)) {
+				str = PyUnicode_AsString(doc);
+				if (str == NULL) {
+					Py_DECREF(type);
+					return NULL;
+				}
+				n = strlen(str);
 			}
-			memcpy(tp_doc, PyString_AS_STRING(doc), n+1);
-			type->tp_doc = tp_doc;
+			if (str != NULL) {
+				tp_doc = (char *)PyObject_MALLOC(n+1);
+				if (tp_doc == NULL) {
+					Py_DECREF(type);
+					return NULL;
+				}
+				memcpy(tp_doc, str, n+1);
+				type->tp_doc = tp_doc;
+			}
 		}
 	}
 
@@ -3485,7 +3500,7 @@
 	 */
 	if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
 		if (type->tp_doc != NULL) {
-			PyObject *doc = PyString_FromString(type->tp_doc);
+			PyObject *doc = PyUnicode_FromString(type->tp_doc);
 			if (doc == NULL)
 				goto error;
 			PyDict_SetItemString(type->tp_dict, "__doc__", doc);
diff --git a/PC/winsound.c b/PC/winsound.c
index 9ff3b7e..9fc7f6f 100644
--- a/PC/winsound.c
+++ b/PC/winsound.c
@@ -202,7 +202,7 @@
 static void
 add_define(PyObject *dict, const char *key, long value)
 {
-    PyObject *k=PyString_FromString(key);
+    PyObject *k=PyUnicode_FromString(key);
     PyObject *v=PyLong_FromLong(value);
     if(v&&k)
     {
diff --git a/Python/future.c b/Python/future.c
index 2092f58..dca1d83 100644
--- a/Python/future.c
+++ b/Python/future.c
@@ -20,7 +20,7 @@
 	names = s->v.ImportFrom.names;
 	for (i = 0; i < asdl_seq_LEN(names); i++) {
                 alias_ty name = (alias_ty)asdl_seq_GET(names, i);
-		const char *feature = PyString_AsString(name->name);
+		const char *feature = PyUnicode_AsString(name->name);
 		if (!feature)
 			return 0;
 		if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) {
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 32bc6f7..542fe38 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -707,12 +707,12 @@
 	}
 	v = PySys_GetObject("ps1");
 	if (v == NULL) {
-		PySys_SetObject("ps1", v = PyString_FromString(">>> "));
+		PySys_SetObject("ps1", v = PyUnicode_FromString(">>> "));
 		Py_XDECREF(v);
 	}
 	v = PySys_GetObject("ps2");
 	if (v == NULL) {
-		PySys_SetObject("ps2", v = PyString_FromString("... "));
+		PySys_SetObject("ps2", v = PyUnicode_FromString("... "));
 		Py_XDECREF(v);
 	}
 	for (;;) {