解决C++调用python传递中文路径的问题

2023-10-27

背景:最近在做使用C++调用python代码来进行图像处理,需要传入一个图像文件的路径,使用

char *picPath = "E:\\pic.jpg";
PyObject *path_ = Py_BuildValue("s", picPath);

来生成图像路径的python对象,当路径是全英文时没有问题,当路径包含中文时,无法创建PyObject对象,path_为空。

原因:

python默认使用utf-8编码,因此当字符串含有中文时,需要转换成utf-8编码的字符串。

解决办法:

1,将路径转成utf-8编码的字符串。由于界面用qt实现,因此我使用了qt的函数来转换:

std::string picPath = "E:\\图片\\pic.jpg";
char *picpath = QString::fromLocal8Bit(picPath.c_str()).toUtf8().data();
PyObject *path_ = Py_BuildValue("s", picPath);

由于在vs环境中,是不支持utf-8的显示的,因此转换后的picpath是乱码。

附上从python接受字符串的转换:

char *retStr = new char[256];
PyArg_Parse(pReturn, "s", &retStr);
QString ss = QString::fromUtf8(retStr);
std::string ss2 = std::string(ss.toLocal8Bit());
delete retStr;

2,将路径转为宽字符,再调用PyUnicode_FromUnicode 来生成PyObject:

std::string picPath = "E:\\图片\\pic.jpg";
QString ss = QString::fromLocal8Bit(picPath.c_str());
wchar_t *picpath_ = new wchar_t[length() + 1];
int wclen = ss.toWCharArray(picpath_);
picpath_[wclen] = 0;

PyObject *path_ = PyUnicode_FromUnicode(picpath_, wclen);

delete picpath_;

3,将路径使用base64编码后传给python,在python里经base64解码后恢复路径(此方法未尝试)。

这时能生成path_对象,但是调用python接口时返回失败,经排查,是由于python代码里使用了cv2.imread()来读入图像,而该接口对中文路径无效;网上搜索了一下,找到一个解决办法:

import numpy as np
image = cv2.imdecode(np.fromfile(picPath,dtype=np.uint8),-1)

参考:

解决C++调用Python中文乱码_kpengk的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决C++调用python传递中文路径的问题 的相关文章

随机推荐

  • JDBC java连接数据库

    JDBC编程六步 注册驱动 告诉java程序 即将连接那个品牌的数据库 Driver driver new com mysql jdbc Driver DriverManager registerDriver driver 或 class
  • Maven的scope=import

    详解内容 maven有个核心文件 名曰pom xml 这个文件中的标签 简直是眼花缭乱 千姿百态 而标签中的值也非常之多 今天我们就scope标签其中一个值import 讲解一番 scope标签的作用 这里不作过多的赘述 不明白的小伙伴 可
  • 基于跳数,时延,带宽的最短/优路径和负载均衡

    基于跳数的最短路径转发 基于跳数的最短路径转发是最简单的最优路径转发应用 我们通过network awareness应用来实现网络拓扑资源的感知并计算最短路径 首先控制器通过下发LLDP报文来获取网络链路信息 然后再利用网络信息 生成网络拓
  • sklearn决策树预剪枝

    老饼讲解机器学习 http ml bbbdata com teach 102 目录 一 预剪枝即调参 二 调参方法 1 默认值预观察生长的树 2 参数限制节点过分生长 为预防模型过拟合 我们可以采用预剪枝和后剪枝方法 1 预剪枝 树构建过程
  • git错误pathspec did not match any file(s) known to git及相关操作

    git error pathspec did not match any file s known to git 本地文件与远程无对应 我这里的情况是在执行 update nrp update all git pull Already up
  • python 连接minio并上传目录及文件

    目录 python sdk安装 python 代码 python sdk安装 python需要3 7及以上版本 pip3 install minio python 代码 from minio import Minio from minio
  • web服务器设置默认网站,web服务器中默认首页和默认网站的配置(以apache服务器为例)...

    默认首页的配置 php 第一种 直接修改apache服务器的配置文件 conf httpd conf中的DirectoryIndex 如 项目web以index php为首页 html DirectoryIndex index html i
  • Python追加文件内容

    Python追加文件内容 测试中需要造几百个账号 写了个脚本可以自动生成账号 但想把生成的账号写入一个文件 开始用的如下的write 方法 发下会先把原文件的内容清空再写入新的东西 文件里面每次都是最新生成的一个账号 mobile Meth
  • c++调用libcurl示例

    include
  • 【STM32】STM32存储映射

    存储映射 stm32f40xx的存储映射图 这幅图很重要 至于为什么 我还没编好 STM32存储空间有多大 芯片能访问的存储空间有多大 为什么 这个是由芯片内 CPU 的地址总线的数量决来定的 STM32 芯片内部的地址总线为32 根 1根
  • flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果

    flutter开发实战 实现marquee文本跑马灯效果 最近开发过程中需要marquee文本跑马灯效果 这里使用到了flutter的插件marquee 效果图如下 一 marquee 1 1 引入marquee 在pubspec yaml
  • 第一课:VxWorks系统概述

    目录 1 1 VxWorks系统简介 1 2 VxWorks的特点 1 3VxWorks系统和Linux系统的区别 1 4 VxWorks开发环境获取 1 1 VxWorks系统简介 VxWorks 操作系统是美国WindRiver公司于1
  • matlab中如何对一个小数取整,学习笔记153—matlab中小数如何取整?

    matlab中小数取整的函数大约有四个 floor ceil round fix 1 round取整方法是四舍五入 round函数功能 四舍五入取整 使用方法 B round A 对数组A中每个元素朝最近的方向取整数部分 并返回与A同维的整
  • 在微信小程序中如何使用wx.onLocationChange(function callback)

    参考文档 点这里 其实我使用这个挨批之前用的是wx getLocation文档点这里 可是很无奈 产品的需求是要从首页点进去的时候获取一次用户坐标 可是如果用户频繁点击在真机上就会出现获取不到的情况 会报以下的错误 如下图所示 所以很尴尬
  • 【python基础】【pandas】读取数据pd.read_csv、列表切片iloc、转换成数组to_numpy

    读取数据保存到data中 路径根据你保存的train csv位置而有变化 big5 是专门针对台湾繁体的 data pd read csv D pycharm HungYiLiData hw1 train csv encoding utf
  • 递归的方法对字符串逆序

    对于字符串逆序 简单的说就是把字符串倒过来 比如说 abcdef 将它逆序后就变成 fedcba 这看起来是多么的简单易懂 但是一旦放到代码中 思维可就要加强十倍了 include
  • 分配学号python

    with open studentList csv mode r encoding utf 8 as stuData lsStu line strip split for line in stuData with open schoolCo
  • 【100%通过率 】【华为OD机试 c++/python】猜字谜【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 小王设计了一个简单的猜字谜游戏 游戏的谜面是一个错误的单词 比如nesw 玩家需要猜出谜底库中正确的单词 猜中的要求如下 对于某个谜面和谜底单词
  • 零日漏洞

    点击上方 订阅话题 第一时间了解漏洞威胁 0x01 漏洞描述 Windows Print Spooler是Windows的打印机后台处理程序 广泛的应用于各种内网中 360漏洞云监测到微软最新披露了一个新的Windows Print Spo
  • 解决C++调用python传递中文路径的问题

    背景 最近在做使用C 调用python代码来进行图像处理 需要传入一个图像文件的路径 使用 char picPath E pic jpg PyObject path Py BuildValue s picPath 来生成图像路径的pytho