1. 程式人生 > 程式設計 >解決c++呼叫python中文亂碼問題

解決c++呼叫python中文亂碼問題

windows中文作業系統下,vs的c++專案預設編碼是GB2312

python預設是utf-8編碼

最好在c++程式頂上加:

#pragma execution_character_set("GB2312")

c++中的字串一定就是gbk編碼

傳入python前要做編碼轉換

準備一個gbk轉utf8的函式,如下(網上的):

 string GbkToUtf8(const char* src_str)
    {
      int len = MultiByteToWideChar(CP_ACP,src_str,-1,NULL,0);
      wchar_t* wstr = new wchar_t[len + 1];
      memset(wstr,len + 1);
      MultiByteToWideChar(CP_ACP,wstr,len);
      len = WideCharToMultiByte(CP_UTF8,NULL);
      char* str = new char[len + 1];
      memset(str,len + 1);
      WideCharToMultiByte(CP_UTF8,str,len,NULL);
      string strTemp = str;
      if (wstr) delete[] wstr;
      if (str) delete[] str;
      return strTemp;
    }

示例性程式碼:

#pragma execution_character_set("GB2312")
#include <stdlib.h>
#include <Windows.h>   
#include <iostream>
#include <Python.h>
#include <string>
#include <atlstr.h>

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::Collections::Generic;
using namespace System::Diagnostics;
using namespace System::Threading;
using namespace std;

int main()
{  
  const char* name = "東方紅1號";
  Py_Initialize();//初始化python
  PyRun_SimpleString("import sys");
  PyRun_SimpleString("sys.path.append('./')");
  PyObject* pModule = PyImport_ImportModule("hello");
  PyObject* pFunc1 = PyObject_GetAttrString(pModule,"sayhello");   
  PyObject* pArgs = PyTuple_New(1);
  PyObject* pV1 = Py_BuildValue("s",GbkToUtf8(name).c_str());      
  PyTuple_SetItem(pArgs,pV1);
  PyObject* result = PyObject_CallObject(pFunc1,pArgs);
  Py_Finalize();
  return 0;

到此這篇關於解決c++呼叫python中文亂碼問題的文章就介紹到這了,更多相關c++呼叫python中文亂碼內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!