热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pybind11使用教程笔记__4.1_数据类型转换string

1.Strings,bytesandUnicodeconversio

1. Strings, bytes and Unicode conversions

Passing Python strings to C++

将python str格式数据传递给C++的函数,如果C++函数的形参是 std::string or char * ,pybind11会自动将Python stringz转为UTF-8的编码方式。所有python的str都能以UTF-8来编码,所以pybind11的这个操作通常都会成功。
The C++ language is encoding agnostic. It is the responsibility of the programmer to track encodings. It’s often easiest to simply use UTF-8 everywhere.

PYBIND11_MODULE(py_string_to_cpp, m){
m.def("utf8_test", [](const std::string &s ){
std::cout<<"utf-8 is icing on cake!!";
std::cout<< s << std::endl;
});

m.def("utf8_charptr", [](char* s){
std::cout<<"my favoriate food is "<< s <<std::endl;
});
}

s = "cake noodles"
utf8_test(s)
utf8_charptr(s)

在这里插入图片描述

无论C++的函数的形参是传值调用还是引用调用,无论形参中是否使用const,测试结果都是一样的。

Passing bytes to C++

python bytes对象 传递给形参为 std::string or char*的C++函数,无需类型转换
为了在python3中使函数只接受bytes (and not str),在C++中使用py::bytes来声明形参。

2. Returning C++ strings to Python

C++返回std::string or char*给python,pybind11会假定 string 为UTF-8ge格式,并将编码为python的str(using the same API as Python uses to perform bytes.decode(‘utf-8’))。如果编码失败,pybind11会报错(UnicodeDecodeErro)

m.def("std_string_return", [](){
return std::string("this std::string needs to be UTF-8 encoded!");
});

m.def("char_ptr_return", [](){
char * s = "thish string needs to be UTF-8 encoded!";
return s;

from py_string_to_cpp import std_string_return, char_ptr_return
print(std_string_return())
print(char_ptr_return())
isinstance(std_string_return(), str)
isinstance(char_ptr_return(), str)

this std::string needs to be UTF-8 encoded!
thish string needs to be UTF-8 encoded!
True
True

Because UTF-8 is inclusive of pure ASCII, there is never any issue with returning a pure ASCII string to Python. If there is any possibility that the string is not pure ASCII, it is necessary to ensure the encoding is valid UTF-8.

Wide character strings

当Python str传递给形参为std::wstring, wchar_t*, std::u16string or std::u32string的C++函数时,str会被编码为UTF-16 or UTF-32,
取决于C++编译器。当这些类型的string从C++向python返回时,会假定这些string有效的UTF-16 UTF-32 格式,并将其编码为python str。

#define UNICODE
#include
m.def("set_window_text",
[](HWND hwnd, std::wstring s) {
// Call SetWindowText with null-terminated UTF-16 string
::SetWindowText(hwnd, s.c_str());
}
);
Character literals

形参为 char wchar_t 的C++函数,如果收到python str类型的输入,会将python str 的第一个字符作为函数的输入,后面的字符会被忽略。

当C++返回一个Character literal时,会将其转换为只有一个字符的python str。

m.def("pass_char", [](char c){
return c;
});
m.def("pass_wchar", [](wchar_t wc){
return wc;
});

from py_string_to_cpp import pass_char, pass_wchar
try:
print(pass_char("abcde"))
print(pass_wchar("abcde"))
except Exception as e:
print(e)
else:
print("pass_car can accept multi char")
finally:
print(pass_char("a"))
print(pass_wchar("a"))

Expected a character, but multi-character string found
a
a


版权声明:本文为weixin_41521681原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_41521681/article/details/106258442
推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
author-avatar
保佑欣疼你的芯疼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有