【问题标题】:Python 2.6 write string in C-API using the system encodingPython 2.6 使用系统编码在 C-API 中写入字符串
【发布时间】:2010-12-21 19:10:38
【问题描述】:

我有一个 Python 2.6 项目,我想使用系统编码将 utf-8 消息写入标准输出。但是,似乎直到 Python 3.2 才存在这样的功能:

PySys_FormatStdout

http://docs.python.org/dev/c-api/sys.html

有没有办法从 Python 2.6 做到这一点?

为了澄清,我有一个横幅需要在 Py_Initialize() 之后和主解释器运行之前打印。该字符串是一个 c 字面量,包含: "\n 和版权 \xC2\xA9"

其中 \xC2\xA9 是 utf-8 版权符号。我在 gdb 中验证了版权符号编码正确。

更新: 我刚刚决定不需要所有这些悲伤,我将从启动横幅中删除冒犯性的角色。这个问题太多了,而且缺乏文档。我的期望是这会像 Tcl,其中:

  1. 嵌入式解释器的 C-API 将使在系统编码中以 unicode 写入 stdout 变得容易,而不是一些默认的 ascii 编码
  2. 如果当前编码中不存在违规字符,则不会引发异常。而是显示一些默认替换字符。
  3. 无需导入其他模块(例如 sys)就可以了解系统编码是什么。

【问题讨论】:

  • 1. bugs.python.org/issue4947(在 Python errors="replace" 而不是 errors="strict" 3. PyUnicode_GetDefaultEncoding()
  • 谢谢 J.F.,到目前为止,我将避免在我的应用程序横幅中使用该字符。

标签: python unicode python-c-api


【解决方案1】:

【讨论】:

  • 谢谢,我只需要知道如何获得与执行 python 解释器的人对 stdout 的任何重定向相关联的 FILE *。
  • 你要么想要stdout 本身,要么想要PySys_GetFile("stdout", stdout),这取决于你的意思。
  • 我对直接使用文件句柄不太熟悉,但我只需要确保写出的内容会转到 stdout 被重定向到的任何位置。
  • 不幸的是,我的所有回车符都转义了该字符串:u'\n-------------------- 并且看起来像某种类型的将进入 python 脚本的文字。另外,感兴趣的符号©写为\xa9,在我的utf-8环境中打印到屏幕上应该是\xc2\xa9
  • sys.stdout 可以使用 .write() 方法引用任意 Python 对象 (PyObject*),但 PyObject_Print() 需要 FILE*
【解决方案2】:

你可以使用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()

【讨论】:

  • 感谢您的建议。我现在遇到的问题是它使用 ASCII 而不是系统的 UTF-8 编码:UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 80: ordinal not in range(128 )
  • @Juan:sys.getdefaultencoding() 返回什么?
  • 'ascii',但需要用到sys.stdout.encoding, 'utf-8'
  • 感谢 J.F. 但我仍然需要弄清楚从 C-API 获取系统标准输出编码的位置,而不需要导入 sys 模块并调用解释器来执行此操作。我想也许可以安全地假设 sys 模块可用于导入。
  • 将其交给 J.F.,因为他正确地将其识别为错误。
猜你喜欢
  • 2023-03-27
  • 2014-02-02
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多