【问题标题】:Python 2.7/3 C module for working with unicode strings用于处理 unicode 字符串的 Python 2.7/3 C 模块
【发布时间】:2012-12-22 13:17:37
【问题描述】:

我在 Python 模块中遇到了关于 UTF-8/16 的不同方法。这是我第一次尝试编写 Python C 模块,我想知道如何从 Unicode 对象中获取所有字节以使用 C 函数处理这些字节。如我所见,这些可以表示为 C char 数组中的简单 ASCII 字符串?

static PyObject* unicode_worker(PyObject* self, PyObject* args)
{
Py_UNICODE  *src;
int srclen;
register Py_UNICODE ch;
wchar_t widecharBuffer[4096];

if (! PyArg_ParseTuple(args, "u#", &src, &srclen))
    return NULL;

ch = *src;

PyUnicode_AsWideChar((PyUnicodeObject *)src, widecharBuffer, srclen-1);

Py_RETURN_NONE;
}

现在当我像这样使用 gdb 时:

gdb python
run sh.py

我可以看到错误:

Program received signal SIGSEGV, Segmentation fault.
0x00000036010b05c8 in PyUnicodeUCS4_AsWideChar () from /usr/lib64/libpython2.7.so.1.0

PyUnicode_AsWideChar 调用中有哪些可以改进的地方,现在有什么问题?

UPD:Mats Petersson,现在问题更清楚了。

【问题讨论】:

  • 你试过了吗?究竟出了什么问题?

标签: python c unicode


【解决方案1】:

最后,我发现,我没有注意到一件重要的事情:Py_UNICODE 包含我需要的所有文本数据,仅此而已。这种类型的字节大小可能会有所不同,因此在不同的操作系统中应该进行检查。无论如何,在我的 Linux 版本中 wchar_t 和 Py_UNICODE 之间没有区别,所以我面临的唯一下一个问题是设置语言环境。它只是求解器:

if (! setlocale(LC_ALL, "ru_RU.utf8")) return PyErr_SetFromErrno(SetLocaleError);
wprintf(L"%ls\n", src);

现在我可以继续试验python模块了,这个问题似乎解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多