diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index e918829..80da47d 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -152,6 +152,100 @@
 	return (PyObject *) op;
 }
 
+PyObject *PyString_Decode(const char *s,
+			  int size,
+			  const char *encoding,
+			  const char *errors)
+{
+    PyObject *buffer = NULL, *str;
+    
+    if (encoding == NULL) 
+	encoding = PyUnicode_GetDefaultEncoding();
+
+    /* Decode via the codec registry */
+    buffer = PyBuffer_FromMemory((void *)s, size);
+    if (buffer == NULL)
+        goto onError;
+    str = PyCodec_Decode(buffer, encoding, errors);
+    if (str == NULL)
+        goto onError;
+    /* Convert Unicode to a string using the default encoding */
+    if (PyUnicode_Check(str)) {
+	PyObject *temp = str;
+	str = PyUnicode_AsEncodedString(str, NULL, NULL);
+	Py_DECREF(temp);
+	if (str == NULL)
+	    goto onError;
+    }
+    if (!PyString_Check(str)) {
+        PyErr_Format(PyExc_TypeError,
+                     "decoder did not return an string object (type=%.400s)",
+                     str->ob_type->tp_name);
+        Py_DECREF(str);
+        goto onError;
+    }
+    Py_DECREF(buffer);
+    return str;
+    
+ onError:
+    Py_XDECREF(buffer);
+    return NULL;
+}
+
+PyObject *PyString_Encode(const char *s,
+			  int size,
+			  const char *encoding,
+			  const char *errors)
+{
+    PyObject *v, *str;
+    
+    str = PyString_FromStringAndSize(s, size);
+    if (str == NULL)
+	return NULL;
+    v = PyString_AsEncodedString(str, encoding, errors);
+    Py_DECREF(str);
+    return v;
+}
+
+PyObject *PyString_AsEncodedString(PyObject *str,
+				   const char *encoding,
+				   const char *errors)
+{
+    PyObject *v;
+    
+    if (!PyString_Check(str)) {
+        PyErr_BadArgument();
+        goto onError;
+    }
+
+    if (encoding == NULL) 
+	encoding = PyUnicode_GetDefaultEncoding();
+
+    /* Encode via the codec registry */
+    v = PyCodec_Encode(str, encoding, errors);
+    if (v == NULL)
+        goto onError;
+    /* Convert Unicode to a string using the default encoding */
+    if (PyUnicode_Check(v)) {
+	PyObject *temp = v;
+	v = PyUnicode_AsEncodedString(v, NULL, NULL);
+	Py_DECREF(temp);
+	if (v == NULL)
+	    goto onError;
+    }
+    if (!PyString_Check(v)) {
+        PyErr_Format(PyExc_TypeError,
+                     "encoder did not return a string object (type=%.400s)",
+                     v->ob_type->tp_name);
+        Py_DECREF(v);
+        goto onError;
+    }
+    return v;
+    
+ onError:
+    return NULL;
+}
+
 static void
 string_dealloc(op)
 	PyObject *op;
@@ -1686,6 +1780,25 @@
 }
 
 
+static char encode__doc__[] =
+"S.encode([encoding[,errors]]) -> string\n\
+\n\
+Return an encoded string version of S. Default encoding is the current\n\
+default string encoding. errors may be given to set a different error\n\
+handling scheme. Default is 'strict' meaning that encoding errors raise\n\
+a ValueError. Other possible values are 'ignore' and 'replace'.";
+
+static PyObject *
+string_encode(PyStringObject *self, PyObject *args)
+{
+    char *encoding = NULL;
+    char *errors = NULL;
+    if (!PyArg_ParseTuple(args, "|ss:encode", &encoding, &errors))
+        return NULL;
+    return PyString_AsEncodedString((PyObject *)self, encoding, errors);
+}
+
+
 static char expandtabs__doc__[] =
 "S.expandtabs([tabsize]) -> string\n\
 \n\
@@ -2252,6 +2365,7 @@
 	{"ljust",       (PyCFunction)string_ljust,       1, ljust__doc__},
 	{"rjust",       (PyCFunction)string_rjust,       1, rjust__doc__},
 	{"center",      (PyCFunction)string_center,      1, center__doc__},
+	{"encode",      (PyCFunction)string_encode,      1, encode__doc__},
 	{"expandtabs",  (PyCFunction)string_expandtabs,  1, expandtabs__doc__},
 	{"splitlines",  (PyCFunction)string_splitlines,  1, splitlines__doc__},
 #if 0
