Python 2.6 使用系统编码通过C-API写字符串

3 投票
2 回答
705 浏览
提问于 2025-04-16 08:51

我有一个用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那样,

  1. 嵌入式解释器的C-API会让用系统编码输出unicode到stdout变得简单,而不是使用某种默认的ascii编码
  2. 如果当前编码中没有某个问题字符,就不会抛出异常,而是会显示一个默认的替代字符。
  3. 不需要导入额外的模块(比如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() 这个函数。

撰写回答