开发者社区> 问答> 正文

传递Unicode字符串给C函数库

你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode。

展开
收起
哦哦喔 2020-04-17 18:15:22 2991 0
2 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!

    传递Unicode字符串给C函数库:可以参考这篇文章: https://www.baidu.com/link?url=6djl4oF9q-bjXsKIc7n5xA5eoO3YbD_ISURCaytWx9o0B2dmmEhXclgxb_R

    2020-04-17 23:56:29
    赞同 展开评论 打赏
  • 这里我们需要考虑很多的问题,但是最主要的问题是现存的C函数库并不理解Python的原生Unicode表示。 因此,你的挑战是将Python字符串转换为一个能被C理解的形式。
    
    为了演示的目的,下面有两个C函数,用来操作字符串数据并输出它来调试和测试。 一个使用形式为 char *, int 形式的字节, 而另一个使用形式为 wchar_t *, int 的宽字符形式:
    
    void print_chars(char *s, int len) {
      int n = 0;
    
      while (n < len) {
        printf("%2x ", (unsigned char) s[n]);
        n++;
      }
      printf("\n");
    }
    
    void print_wchars(wchar_t *s, int len) {
      int n = 0;
      while (n < len) {
        printf("%x ", s[n]);
        n++;
      }
      printf("\n");
    }
    对于面向字节的函数 print_chars() ,你需要将Python字符串转换为一个合适的编码比如UTF-8. 下面是一个这样的扩展函数例子:
    
    static PyObject *py_print_chars(PyObject *self, PyObject *args) {
      char *s;
      Py_ssize_t  len;
    
      if (!PyArg_ParseTuple(args, "s#", &s, &len)) {
        return NULL;
      }
      print_chars(s, len);
      Py_RETURN_NONE;
    }
    对于那些需要处理机器本地 wchar_t 类型的库函数,你可以像下面这样编写扩展代码:
    
    static PyObject *py_print_wchars(PyObject *self, PyObject *args) {
      wchar_t *s;
      Py_ssize_t  len;
    
      if (!PyArg_ParseTuple(args, "u#", &s, &len)) {
        return NULL;
      }
      print_wchars(s,len);
      Py_RETURN_NONE;
    }
    下面是一个交互会话来演示这个函数是如何工作的:
    
    >>> s = 'Spicy Jalape\u00f1o'
    >>> print_chars(s)
    53 70 69 63 79 20 4a 61 6c 61 70 65 c3 b1 6f
    >>> print_wchars(s)
    53 70 69 63 79 20 4a 61 6c 61 70 65 f1 6f
    >>>
    仔细观察这个面向字节的函数 print_chars() 是怎样接受UTF-8编码数据的, 以及 print_wchars() 是怎样接受Unicode编码值的
    
    2020-04-17 18:15:31
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载