c++调用python以及使用python将gbk/utf-8转punycode

最近遇到一个需求,关于DNS方面的,由于中文域名采用punycode编码,因此需要将程序中使用gbk的域名转为punycode

但是。。。c++的libidn库用起来相比python一句代码转化实在是太恶心了。。。

首先安装python-dev

sudo apt-get install python-dev

先看python端的写法,如果只需要看c++如何调用python的可以直接跳过

gbk转punycode只需要一行代码就可以,utf-8同理,把gbk换成utf-8即可

string.decode('gbk').encode('punycode')
但这离需求还是有点远,punycode编码有点不同,例如“中国”,将“中国”两个字直接转punycode和将两个字分开转得到的punycode结果是不一样的

中文域名中往往是中英都有的,因此python代码如下 punycode.py

 
 
def gbk_to_punycode(string):
    string = string.decode("gbk")
    new_string = str()
    substring = str()
    for w in string:
        if is_chinese(w):
            substring += w
        else:
            if substring == '':
                new_string += w
            else:
                new_string += substring.encode("punycode")
                substring = ''
                new_string += w
    new_string += substring.encode("punycode")
    return "xn--"+new_string

现在来写c++端,具体原理直接写注释在每一行 

punycode.cpp

#include <iostream>
#include <Python.h>
using namespace std;
char *gbk_to_punycode(char *str)
{
    PyObject *pmodule = NULL;             
    PyObject *fgbk_to_punycode = NULL;
    PyObject *arg;
    PyObject *result;
    Py_Initialize();                                  //初始化python
    PyRun_SimpleString("import sys");                 //调用python的命令引入sys模块
    PyRun_SimpleString("sys.path.append('./')");      //添加当前路径
    pmodule = PyImport_ImportModule("punycode");      //引入模块"punycode",python文件名为punycode.py
    fgbk_to_punycode = PyObject_GetAttrString(pmodule, "gbk_to_punycode");     //获得python中gbk_to_punycode函数
    char *name = new char[256];
    arg = Py_BuildValue("(s)", str);                  //生成python函数的参数
    result = PyEval_CallObject(fgbk_to_punycode, arg);     //调用python函数,并将结果存入result
    PyArg_Parse(result, "s", &name);                  //解析result获得返回值
    Py_Finalize();                                    //关闭python
    return name;
}


int main(int argc, char const *argv[])
{
    // test();
    char *p = new char[20];
    cin>> p;
    cout<< "the result is "<< punycode_to_gbk(p)<< endl;
    return 0;
}

编译一下

g++ -o punycode punycode.cpp -I/usr/include/python2.7/ -L/usr/lib/ -lpython2.7

运行即可

对python参数生成和python参数解析的两个函数的参数可以看博客http://blog.chinaunix.net/uid-22920230-id-3443571.html





你可能感兴趣的:(c++调用python以及使用python将gbk/utf-8转punycode)