c拡張でPyUnicodeObject, PyStringObjectの相互変換を楽にする
'ほげほげ'.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