Python 2.6 使用系统编码通过C-API写字符串
我有一个用Python 2.6写的项目,我想用系统编码把一个utf-8的消息写到标准输出(stdout)上。不过看起来在Python 3.2之前是没有这样的功能的:
PySys_FormatStdout
http://docs.python.org/dev/c-api/sys.html
那么在Python 2.6中有没有办法做到这一点呢?
为了更清楚,我有一个横幅(banner)需要在Py_Initialize()之后、主解释器运行之前打印出来。这个字符串是一个C语言字面量,内容是:"\n和 版权符号 \xC2\xA9"
其中\xC2\xA9是utf-8的版权符号。我在gdb中确认过版权符号的编码是正确的。
更新: 我刚决定这些麻烦其实没必要,我要把启动横幅中的那个问题字符去掉。因为这方面的问题实在太多,而且文档也不够详细。我原本以为这会像Tcl那样,
- 嵌入式解释器的C-API会让用系统编码输出unicode到stdout变得简单,而不是使用某种默认的ascii编码
- 如果当前编码中没有某个问题字符,就不会抛出异常,而是会显示一个默认的替代字符。
- 不需要导入额外的模块(比如sys)来仅仅了解系统编码是什么。
2 个回答
2
PyUnicode_DecodeUTF8()
是一个用于将UTF-8编码的字符串转换为Python内部使用的Unicode字符串的函数。简单来说,它帮助程序理解和处理用UTF-8格式写的文本。
PyObject_Print()
是一个用来打印Python对象的函数。这个函数可以把Python中的各种数据(比如数字、字符串、列表等)显示出来,方便我们查看它们的内容。
1
你可以使用 PyFile_WriteObject() 这个函数:
f_stdout = PySys_GetObject("stdout");
text = PyUnicode_DecodeUTF8((char*)str, strlen(str), "strict");
PyFile_WriteObject(text, f_stdout, Py_PRINT_RAW);
如果你知道最终的编码方式,那么你可以使用 PyUnicode_AsEncodedString()
这个函数。