From 8df545ad514074ac26714cebfa6f3584811d3952 Mon Sep 17 00:00:00 2001 From: Sven Trenkel Date: Sun, 6 Dec 2009 02:20:05 +0100 Subject: [PATCH] Better unicode support. --- src/collectd-python.pod | 11 ++++++++++- src/python.c | 14 +++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/collectd-python.pod b/src/collectd-python.pod index c07ebf96..cd9678ac 100644 --- a/src/collectd-python.pod +++ b/src/collectd-python.pod @@ -27,6 +27,8 @@ for collectd in Python. This is a lot more efficient than executing a Python-script every time you want to read a value with the C (see L) and provides a lot more functionality, too. +Currently only python2 is supported and at least version 2.3 is required. + =head1 CONFIGURATION =over 4 @@ -40,7 +42,14 @@ see. If you don't do this or your platform does not support it, the embeded interpreter will start anywa but you won't be able to load certain python modules, e.g. "time". -=item B I +=item B I + +The default encoding for unicode objects you pass to collectd. If you obmit +this option it will default to B on python2 and B on python3. +This is hardcoded in python and will ignore everything else, including your +locale. + +=item B I Appends I to B. You won't be able to import any scripts you wrote unless they are located in one of the directuries in this list. Please diff --git a/src/python.c b/src/python.c index cdc6d26d..08abfd1d 100644 --- a/src/python.c +++ b/src/python.c @@ -634,7 +634,13 @@ static PyObject *cpy_unregister_generic_userdata(cpy_unregister_function_t *unre char buf[512]; const char *name; - if (PyString_Check(arg)) { + if (PyUnicode_Check(arg)) { + arg = PyUnicode_AsEncodedString(arg, NULL, NULL); + if (arg == NULL) + return NULL; + name = PyString_AsString(arg); + Py_DECREF(arg); + } else if (PyString_Check(arg)) { name = PyString_AsString(arg); } else { if (!PyCallable_Check(arg)) { @@ -888,6 +894,12 @@ static int cpy_config(oconfig_item_t *ci) { if (item->values_num != 1 || item->values[0].type != OCONFIG_TYPE_BOOLEAN) continue; do_interactive = item->values[0].value.boolean; + } else if (strcasecmp(item->key, "Encoding") == 0) { + if (item->values_num != 1 || item->values[0].type != OCONFIG_TYPE_STRING) + continue; + /* Why is this even necessary? And undocumented? */ + if (PyUnicode_SetDefaultEncoding(item->values[0].value.string)) + cpy_log_exception("setting default encoding"); } else if (strcasecmp(item->key, "LogTraces") == 0) { if (item->values_num != 1 || item->values[0].type != OCONFIG_TYPE_BOOLEAN) continue; -- 2.30.2