当前位置: 首页 > wzjs >正文

网站子目录建立潮州网站建设

网站子目录建立,潮州网站建设,字母logo设计在线生成,网站帮企业做推广价格怎么算使用pybind11开发供Python项目使用的C扩展模块时,如果在扩展模块的C代码中向控制台输出的信息中包含中文,python程序的控制台很容易出现乱码。以如下C扩展框架代码为例(这是对上一篇文章简明使用pybind11开发pythonc扩展模块教程-CSDN博客中的…

使用pybind11开发供Python项目使用的C++扩展模块时,如果在扩展模块的C++代码中向控制台输出的信息中包含中文,python程序的控制台很容易出现乱码。以如下C++扩展框架代码为例(这是对上一篇文章简明使用pybind11开发pythonc+扩展模块教程-CSDN博客中的C++扩展框架代码进行少量修正后的结果):

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <locale>
#include <codecvt>
#include <windows.h>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>namespace py = pybind11;class CSVFinder {
private:std::map<std::string, std::vector<std::string>> dataMap;std::vector<std::string> headers;public:// 默认构造函数CSVFinder() {}// 接受 CSV 文件路径的构造函数CSVFinder(const std::string& filePath) {loadCSV(filePath);}// 载入 CSV 文件的方法void loadCSV(const std::string& filePath) {// 检查文件扩展名是否为 .csvif (filePath.substr(filePath.find_last_of(".") + 1) != "csv") {std::cerr << "文件扩展名不是 .csv,但仍尝试解析: "  << filePath << std::endl;}std::ifstream file(filePath);if (!file.is_open()) {std::cerr << "无法打开文件,请检查文件名或路径是否错误: " << filePath <<  std::endl;dataMap.clear();headers.clear();return;}std::string line;// 读取第一行作为标题if (!std::getline(file, line)) {std::cerr << "无法读取文件的第一行,请检查文件内容: " << filePath << std::endl;dataMap.clear();headers.clear();return;}std::istringstream iss(line);std::string token;while (std::getline(iss, token, ',')) {headers.push_back(token);}if (headers.empty()) {std::cerr << "第一行未包含有效的标题信息,请检查文件内容: "<< filePath << std::endl;dataMap.clear();headers.clear();return;}// 读取后续行while (std::getline(file, line)) {std::istringstream iss(line);std::vector<std::string> values;std::string token;while (std::getline(iss, token, ',')) {values.push_back(token);}if (values.empty()) {std::cerr << "某行未包含有效的数据信息,请检查文件内容: "<< filePath << std::endl;dataMap.clear();headers.clear();return;}std::string key = values[0];values.erase(values.begin());dataMap[key] = values;}if (dataMap.empty()) {std::cerr << "The file does not contain valid data lines:"<< filePath << std::endl;dataMap.clear();headers.clear();return;}file.close();}// 返回 dataMap 的方法const std::map<std::string, std::vector<std::string>>& getDataMap() const {return dataMap;}// 返回 headers 的方法const std::vector<std::string>& getHeaders() const {return headers;}// 查找数据的方法py::object findData(const std::string& rowTitle, const std::string& colTitle) {auto rowIt = dataMap.find(rowTitle);if (rowIt != dataMap.end()) {for (size_t i = 1; i < headers.size(); ++i) {if (headers[i] == colTitle && i < rowIt->second.size()) {return py::cast(rowIt->second[i]);}}}return py::none();  // 返回 None 对象}// 查找行的方法std::vector<std::string> findRow(const std::string& rowTitle) {auto it = dataMap.find(rowTitle);if (it != dataMap.end()) {return it->second;}return {};}// 查找列的方法std::vector<std::string> findColumn(const std::string& colTitle) {std::vector<std::string> column;// 查找列标题在headers中的索引, 注意 headers[0] 为行标题,因此从index 1开始int colIndex = -1;for (size_t i = 1; i < headers.size(); ++i) {if (headers[i] == colTitle) {colIndex = static_cast<int>(i - 1); // 对应到每行数据中的索引break;}}if (colIndex < 0) {return column; // 未找到对应的列标题,返回空向量}// 遍历每一行数据for (const auto& row : dataMap) {const std::vector<std::string>& values = row.second;if (static_cast<size_t>(colIndex) < values.size()) {column.push_back(values[colIndex]);}else {column.push_back(""); // 如该行数据列数不足,可选择返回空字符串}}return column;}
};PYBIND11_MODULE(CSVFinder, m) {py::class_<CSVFinder>(m, "CSVFinder").def(py::init<>()).def(py::init<const std::string&>()).def("load_csv", &CSVFinder::loadCSV).def("get_datamap", &CSVFinder::getDataMap).def("get_headers", &CSVFinder::getHeaders).def("find_data", &CSVFinder::findData).def("find_row", &CSVFinder::findRow).def("find_column", &CSVFinder::findColumn);
}

其中loadCSV方法中有不少向控制台输入的错误信息。将上面的框架构建分发给Python项目使用(具体过程参见本文开头提到的博客),使用下面的python代码进行测试:

from CSVFinder import CSVFinderwidth = 8file = "E:/projects/ziweidoushu/csv1/destiny_type.csv"
finder = CSVFinder(file)
dict = finder.get_datamap()
headers = finder.get_headers()
print(f'{[value.ljust(width) + "|" for value in headers]}')
for key, values in dict.items():print(f'{key.ljust(width)  + "|" }:{[value.ljust(width)  + "|" for value in values]}')
key = '甲'
row = finder.find_row(key)
print(f"{key.ljust(width)  + '|' }:{len(row)}:{[value.ljust(width)  + '|' for value in row]}")
key = '寅'
column = finder.find_column(key)
print(f"{key.ljust(width)  + '|' }:{len(column)}:{[value.ljust(width)  + '|' for value in column]}")

测试程序中的文件路径故意写错了,本来应该向控制台输出C++代码中的包含中文的错误信息:

无法打开文件,请检查文件名或路径是否错误: E:/projects/ziweidoushu/csv1/destiny_type.csv

在控制台执行测试程序,实际输出如下图:

可以看到C++扩展模块向控制台输出的中文信息变成了乱码,但是Python程序向控制台输出的中文信息则显示正常。AI以及不少文章说用下面的命令将控制台所使用的编码改成UTF-8能够解决问题:

chcp 65001

实际上起不了作用:

实际上只要在C++扩展模块中在字符串前加上u8修饰符、在模块入口处将控制台编码改为UTF-8,并给编译器加上“/utf-8”选项即可正常显示中文,而无需调整控制台编码页。也就是:

1、在C++扩展模块代码中包含<windows.h>,然后调用Windows API在pybind11模块入口处进行如下调用即可:

//省略一些代码

 std::cerr << u8"无法打开文件,请检查文件名或路径是否错误: " << filePath << std::endl;

// 省略一些代码

PYBIND11_MODULE(CSVFinder, m) {
    SetConsoleOutputCP(CP_UTF8);  // 增加的代码
    std::cerr.imbue(std::locale("chs"));  // 增加的代码,可省略
    std::cout.imbue(std::locale("chs"));  // 增加的代码,可省略

// 省略后面的代码

实际上C++扩展模块中增加的三行代码后面两行省略也能解决问题,但考虑到提高健壮性,加上后两行代码,让控制台认为处于中文环境中。

2、在setup.py的扩展模块定义中,增加“/utf-8”选项:

# 定义扩展模块
csv_module = Extension(
    'CSVFinder',  # 模块名称
    sources=['read_csv.cpp'],  # C++ 源文件路径
    include_dirs=[pybind11.get_include(), ],  
    language='c++',  # 指定使用 C++ 语言
    extra_compile_args=['/utf-8','-D_WIN32_WINNT=0x0601', '-D__USE_MINGW_ANSI_STDIO=1'],  # 编译选项
)

重新构建并测试,结果如下:

http://www.dtcms.com/wzjs/412219.html

相关文章:

  • 设计logo网站免费南蒲四特什么是长尾关键词举例
  • win10做的网站其他电脑访问不了北京百度推广代运营
  • 做外贸主要是哪些网站搜索引擎排名原理
  • 住房及城乡建设部信息中心网站最好用的免费建站
  • 海淀建设网站东莞企业网站排名
  • 南水北调中线建建设管理局网站巨量引擎广告投放平台登录入口
  • wordpress改为直接填写密码落实好疫情防控优化措施
  • 网站建设邯郸石家庄网站建设公司
  • 网站建设审批爱站网关键词排名
  • dedecms 做电商网站怎么弄一个自己的网址
  • 什么网站免费做游戏seo搜索引擎优化是通过优化答案
  • 青岛门户网站建设百度爱采购关键词优化
  • wordpress 做企业网站网络零售的优势有哪些
  • 威海建设集团网站首页最好用的磁力搜索神器
  • 浦东新区网站建设什么是软文营销
  • 免费做婚礼邀请函的网站网页广告调词平台
  • 简述网站开发设计流程it培训四个月骗局
  • 成都企业如何建网站深圳网络seo推广
  • 网站怎么推广怎么做百度上做优化一年多少钱
  • 周口城乡建设局网站新东方留学机构官网
  • 做产品设计之前怎么查资料国外网站免费b2b平台推广
  • 动态网站开发与设计关键技术大数据网络营销
  • 做网站要不要买服务器百度大数据分析工具
  • 大连学网站制作网络热词2021
  • 做css div网站公司百度网站站长工具
  • 建设一个网站流程图景德镇seo
  • 房子已交房 建设局网站查不到关键词优化公司靠谱推荐
  • 建站公司联系电话学seo如何入门
  • 设计网站建设方案做企业网站建设公司哪家好
  • 深圳58网站建设青岛网站权重提升