c拡張でPyUnicodeObject, PyStringObjectの相互変換を楽にする

pythonでいうunicode⇔string変換。

'ほげほげ'.decode('utf-8', 'ignore')
u'ほげほげ'.encode('utf-8', 'ignore')

内部的にはunicodeはPyUnicodeObject, stringはPyStringObjectという構造体で管理してらっしゃる。この2つをCで楽に相互変換したい。ちなみに、デコードはこんな感じになる。

char *str = "ほげほげですよ";
PyUnicode_Decode(str, strlen(str), "utf-8", "ignore");

長いw マクロ化しちゃいます。

#ifndef __COMMON_H__
#define __COMMON_H_

#define DEBUG
#ifdef DEBUG
  #define LOG printf
#else
  #define LOG
#endif

#define ENCODING_CHARSET	"cp932"
#define ENCODING_ONERROR	"ignore"

/*
 * PyUnicodeObject → (char *)
 */
#define UNI_STR(item)	PyString_AsString(PyUnicode_AsEncodedString(item, ENCODING_CHARSET, ENCODING_ONERROR))

/*
 * (char *) → PyUnicodeObject
 */
#define STR_UNI(str)	PyUnicode_Decode(str, strlen(str), ENCODING_CHARSET, ENCODING_ONERROR)

/*
 * PyUnicodeObject + (char *)
 */
#define UNI_CAT(item, str)	PyUnicode_Concat(item, \
				STR_UNI(str))


#endif