Add generic codecs.encode() and .decode() APIs that don't impose

any restriction on the return type (like unicode.encode() et al. do).
This commit is contained in:
Marc-André Lemburg 2004-07-10 12:06:10 +00:00
parent 126b44cd41
commit 3f41974525
2 changed files with 83 additions and 5 deletions

View File

@ -336,6 +336,15 @@ class CodecTest(unittest.TestCase):
def test_builtin(self): def test_builtin(self):
self.assertEquals(unicode("python.org", "idna"), u"python.org") self.assertEquals(unicode("python.org", "idna"), u"python.org")
class CodecsModuleTest(unittest.TestCase):
def test_decode(self):
self.assertEquals(codecs.decode('\xe4\xf6\xfc', 'latin-1'),
u'\xe4\xf6\xfc')
def test_encode(self):
self.assertEquals(codecs.encode(u'\xe4\xf6\xfc', 'latin-1'),
'\xe4\xf6\xfc')
def test_main(): def test_main():
test_support.run_unittest( test_support.run_unittest(
UTF16Test, UTF16Test,
@ -343,7 +352,8 @@ def test_main():
RecodingTest, RecodingTest,
PunycodeTest, PunycodeTest,
NameprepTest, NameprepTest,
CodecTest CodecTest,
CodecsModuleTest
) )

View File

@ -47,7 +47,7 @@ one argument, the encoding name in all lower case letters, and return\n\
a tuple of functions (encoder, decoder, stream_reader, stream_writer)."); a tuple of functions (encoder, decoder, stream_reader, stream_writer).");
static static
PyObject *codecregister(PyObject *self, PyObject *args) PyObject *codec_register(PyObject *self, PyObject *args)
{ {
PyObject *search_function; PyObject *search_function;
@ -71,7 +71,7 @@ Looks up a codec tuple in the Python codec registry and returns\n\
a tuple of functions."); a tuple of functions.");
static static
PyObject *codeclookup(PyObject *self, PyObject *args) PyObject *codec_lookup(PyObject *self, PyObject *args)
{ {
char *encoding; char *encoding;
@ -84,6 +84,72 @@ PyObject *codeclookup(PyObject *self, PyObject *args)
return NULL; return NULL;
} }
PyDoc_STRVAR(encode__doc__,
"encode(obj, [encoding[,errors]]) -> object\n\
\n\
Encodes obj using the codec registered for encoding. encoding defaults\n\
to the default 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', 'replace' and\n\
'xmlcharrefreplace' as well as any other name registered with\n\
codecs.register_error that can handle ValueErrors.");
static PyObject *
codec_encode(PyObject *self, PyObject *args)
{
char *encoding = NULL;
char *errors = NULL;
PyObject *v;
if (!PyArg_ParseTuple(args, "O|ss:encode", &v, &encoding, &errors))
return NULL;
if (encoding == NULL)
encoding = PyUnicode_GetDefaultEncoding();
/* Encode via the codec registry */
v = PyCodec_Encode(v, encoding, errors);
if (v == NULL)
goto onError;
return v;
onError:
return NULL;
}
PyDoc_STRVAR(decode__doc__,
"decode(obj, [encoding[,errors]]) -> object\n\
\n\
Decodes obj using the codec registered for encoding. encoding defaults\n\
to the default 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'\n\
as well as any other name registerd with codecs.register_error that is\n\
able to handle ValueErrors.");
static PyObject *
codec_decode(PyObject *self, PyObject *args)
{
char *encoding = NULL;
char *errors = NULL;
PyObject *v;
if (!PyArg_ParseTuple(args, "O|ss:decode", &v, &encoding, &errors))
return NULL;
if (encoding == NULL)
encoding = PyUnicode_GetDefaultEncoding();
/* Decode via the codec registry */
v = PyCodec_Decode(v, encoding, errors);
if (v == NULL)
goto onError;
return v;
onError:
return NULL;
}
/* --- Helpers ------------------------------------------------------------ */ /* --- Helpers ------------------------------------------------------------ */
static static
@ -765,10 +831,12 @@ static PyObject *lookup_error(PyObject *self, PyObject *args)
/* --- Module API --------------------------------------------------------- */ /* --- Module API --------------------------------------------------------- */
static PyMethodDef _codecs_functions[] = { static PyMethodDef _codecs_functions[] = {
{"register", codecregister, METH_VARARGS, {"register", codec_register, METH_VARARGS,
register__doc__}, register__doc__},
{"lookup", codeclookup, METH_VARARGS, {"lookup", codec_lookup, METH_VARARGS,
lookup__doc__}, lookup__doc__},
{"encode", codec_encode, METH_VARARGS},
{"decode", codec_decode, METH_VARARGS},
{"escape_encode", escape_encode, METH_VARARGS}, {"escape_encode", escape_encode, METH_VARARGS},
{"escape_decode", escape_decode, METH_VARARGS}, {"escape_decode", escape_decode, METH_VARARGS},
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE