c++ 中文转拼音的封装, char 类型 不支持 中文 已解决

        在日常业务中,需要进行中文转拼音的检索。已便实现对应的 模糊搜索。

 使用方法

	std::string res = "我是中国人";

	char* result = new char[res.length() + 1];
	for (int i = 0; i < res.length(); ++i)
	{
		result[i] = res[i];
	}

	result[res.length()] = '\0';

	std::string str2(result);

	std::string p = m_pinyin->chineseConvertPinYinAllSpell(str2);

	qDebug() << "pinyin 9999999999999" << p;


void CCendPinyinSearch::insertSearchIndex(int index,QString name)
{

	// 检索索引
	QMap<int,QString> m_pSearchIndex;

    m_pSearchIndex.insert(index, name);
}

void CCendPinyinSearch::getSeachIndexList(QString name)
{

    QMap<int, QString>::const_iterator i;

    for (i = m_pSearchIndex.constBegin(); i != m_pSearchIndex.constEnd(); ++i) 
    {
        qDebug() << "123123777777777777777 index" << i.key() << ": " << i.value();

        if (i.value() == name)
        {
            qDebug() << "123123123888888888888 index" << i.key() << ": " << i.value();
        }
    }
}

//检查哈希表  查找
bool CCendPinyinSearch::isContainsAllCharactersHash(const std::string& mainString, const std::string& subString) {
	  // 初始化哈希表  
		std::unordered_map<char, int> charCounts;
		for (char c : subString) {
			charCounts[c]++;
		}

		// 遍历主字符串并更新哈希表  
		for (char c : mainString) {
			if (charCounts.find(c) != charCounts.end()) {
				charCounts[c]--;
				if (charCounts[c] == 0) {
					// 如果字符的计数减到0,从哈希表中删除该字符  
					charCounts.erase(c);
				}
			}
		}

	// 检查哈希表  
	return charCounts.empty(); // 如果哈希表为空,说明所有字符都被找到了  
}

// 排序算法 查找匹配
bool CCendPinyinSearch::isContainsAllCharacters(const std::string& mainString, const std::string& subString) {
    // 对两个字符串进行排序
    std::string sorted_main = mainString;
    std::string sorted_sub = subString;
    std::sort(sorted_main.begin(), sorted_main.end());
    std::sort(sorted_sub.begin(), sorted_sub.end());

    // 使用双指针法检查 sorted_sub 是否是 sorted_main 的子序列  
    int i = 0, j = 0;
    while (i < sorted_sub.length() && j < sorted_main.length()) {
        if (sorted_sub[i] == sorted_main[j]) {
            i++; // 移动到 sorted_sub 的下一个字符  
        }
        j++; // 移动到 sorted_main 的下一个字符  
    }

    // 如果 sorted_sub 的所有字符都在 sorted_main 中找到,则 sorted_sub 是 sorted_main 的子序列  
    return  sorted_sub.length() == i;
}


std::string CCendPinyinSearch::chineseConvertPinYinAllSpell(const std::string & dest_chinese)
{
    static const int spell_value[] = { -20319, -20317, -20304, -20295,
        -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036,
        -20032, -20026,
        -20002, -19990, -19986, -19982, -19976, -19805, -19784, -19775,
        -19774, -19763, -19756, -19751, -19746, -19741, -19739, -19728,
        -19725, -19715, -19540, -19531, -19525, -19515, -19500, -19484,
        -19479, -19467, -19289, -19288, -19281, -19275, -19270, -19263,
        -19261, -19249, -19243, -19242, -19238, -19235, -19227, -19224,
        -19218, -19212, -19038, -19023, -19018, -19006, -19003, -18996,
        -18977, -18961, -18952, -18783, -18774, -18773, -18763, -18756,
        -18741, -18735, -18731, -18722, -18710, -18697, -18696, -18526,
        -18518, -18501, -18490, -18478, -18463, -18448, -18447, -18446,
        -18239, -18237, -18231, -18220, -18211, -18201, -18184, -18183,
        -18181, -18012, -17997, -17988, -17970, -17964, -17961, -17950,
        -17947, -17931, -17928, -17922, -17759, -17752, -17733, -17730,
        -17721, -17703, -17701, -17697, -17692, -17683, -17676, -17496,
        -17487, -17482, -17468, -17454, -17433, -17427, -17417, -17202,
        -17185, -16983, -16970, -16942, -16915, -16733, -16708, -16706,
        -16689, -16664, -16657, -16647, -16474, -16470, -16465, -16459,
        -16452, -16448, -16433, -16429, -16427, -16423, -16419, -16412,
        -16407, -16403, -16401, -16393, -16220, -16216, -16212, -16205,
        -16202, -16187, -16180, -16171, -16169, -16158, -16155, -15959,
        -15958, -15944, -15933, -15920, -15915, -15903, -15889, -15878,
        -15707, -15701, -15681, -15667, -15661, -15659, -15652, -15640,
        -15631, -15625, -15454, -15448, -15436, -15435, -15419, -15416,
        -15408, -15394, -15385, -15377, -15375, -15369, -15363, -15362,
        -15183, -15180, -15165, -15158, -15153, -15150, -15149, -15144,
        -15143, -15141, -15140, -15139, -15128, -15121, -15119, -15117,
        -15110, -15109, -14941, -14937, -14933, -14930, -14929, -14928,
        -14926, -14922, -14921, -14914, -14908, -14902, -14894, -14889,
        -14882, -14873, -14871, -14857, -14678, -14674, -14670, -14668,
        -14663, -14654, -14645, -14630, -14594, -14429, -14407, -14399,
        -14384, -14379, -14368, -14355, -14353, -14345, -14170, -14159,
        -14151, -14149, -14145, -14140, -14137, -14135, -14125, -14123,
        -14122, -14112, -14109, -14099, -14097, -14094, -14092, -14090,
        -14087, -14083, -13917, -13914, -13910, -13907, -13906, -13905,
        -13896, -13894, -13878, -13870, -13859, -13847, -13831, -13658,
        -13611, -13601, -13406, -13404, -13400, -13398, -13395, -13391,
        -13387, -13383, -13367, -13359, -13356, -13343, -13340, -13329,
        -13326, -13318, -13147, -13138, -13120, -13107, -13096, -13095,
        -13091, -13076, -13068, -13063, -13060, -12888, -12875, -12871,
            -12860, -12858, -12852, -12849, -12838, -12831, -12829, -12812,
        -12802, -12607, -12597, -12594, -12585, -12556, -12359, -12346,
        -12320, -12300, -12120, -12099, -12089, -12074, -12067, -12058,
        -12039, -11867, -11861, -11847, -11831, -11798, -11781, -11604,
        -11589, -11536, -11358, -11340, -11339, -11324, -11303, -11097,
        -11077, -11067, -11055, -11052, -11045, -11041, -11038, -11024,
        -11020, -11019, -11018, -11014, -10838, -10832, -10815, -10800,
        -10790, -10780, -10764, -10587, -10544, -10533, -10519, -10331,
        -10329, -10328, -10322, -10315, -10309, -10307, -10296, -10281,
        -10274, -10270, -10262, -10260, -10256, -10254 };
    // 395个字符串,每个字符串长度不超过6 
    static const char spell_dict[396][7] = { "a", "ai", "an", "ang",
    "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi",
    "bian", "biao",
    "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao",
    "ce", "ceng", "cha", "chai", "chan", "chang", "chao", "che", "chen",
    "cheng", "chi", "chong", "chou", "chu", "chuai", "chuan", "chuang",
    "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "cuan", "cui",
    "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "deng", "di",
    "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan",
    "dui", "dun", "duo", "e", "en", "er", "fa", "fan", "fang", "fei",
    "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", "gao",
    "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai",
    "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang",
    "hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua",
    "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian",
    "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan",
    "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "ken",
    "keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui",
    "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei",
    "leng", "li", "lia", "lian", "liang", "liao", "lie", "lin", "ling",
    "liu", "long", "lou", "lu", "lv", "luan", "lue", "lun", "luo",
    "ma", "mai", "man", "mang", "mao", "me", "mei", "men", "meng", "mi",
    "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu",
    "na", "nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni",
    "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong",
    "nu", "nv", "nuan", "nue", "nuo", "o", "ou", "pa", "pai", "pan",
    "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie",
    "pin", "ping", "po", "pu", "qi", "qia", "qian", "qiang", "qiao",
    "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun",
    "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou",
    "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang",
    "sao", "se", "sen", "seng", "sha", "shai", "shan", "shang", "shao",
    "she", "shen", "sheng", "shi", "shou", "shu", "shua",
    "shuai", "shuan", "shuang", "shui", "shun", "shuo", "si", "song",
    "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai",
    "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao", "tie",
    "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo",
    "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi",
    "xia", "xian", "xiang", "xiao", "xie", "xin", "xing",
    "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yang",
    "yao", "ye", "yi", "yin", "ying", "yo", "yong", "you",
    "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze",
    "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang",
    "zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu",
    "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo",
    "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo" };
    std::string pinyin;
    const int length = dest_chinese.length();
    for (int j = 0, chrasc = 0; j < length;) {
        // 非汉字处理
        if (dest_chinese.at(j) >= 0 && dest_chinese.at(j) < 128) {
            pinyin += dest_chinese[j];
            // 偏移下标
            j++;
            continue;
        } // 汉字处理
        chrasc = dest_chinese[j] * 256 + dest_chinese[j + 1] + 256;
        if (chrasc > 0 && chrasc < 160) {
            // 非汉字
            pinyin += dest_chinese.at(j);
            // 偏移下标
            j++;
        }
        else {
            // 汉字
            for (int i = (sizeof(spell_value) / sizeof(spell_value[0]) - 1);
                i >= 0; --i) {
                // 查找字典
                if (spell_value[i] <= chrasc) {
                    pinyin += spell_dict[i];
                    break;
                }
            } // 偏移下标 (汉字双字节)
            j += 2;
        }
    }
    // for end
    return pinyin;
}

 测试的 拼音完全正确,谁能告诉我哪儿出错l

错误的拼音!!! 

 拼音 翻译的很到位,关键不认识!

正确的 拼音

		// 查询 数据拼音
		//std::string p = m_pPinyinSearch->chineseConvertPinYinAllSpell(searchName.toStdString());

		std::string p = m_pPinyinSearch->chineseConvertPinYinAllSpell(string((const char*)searchName.toLocal8Bit()));

 

string与QString之间的转换 

 1.fromStdString直接转换

string str;
QString qstr;
 
//从QString 到 std::string
str = qstr.toStdString();
 
//从std::string 到QString
qstr = QString::fromStdString(str);

 2.fromLocal8Bit(cstr.c_str())

std::string cstr;
QString qstring;
 
//从std::string 到QString
qstring = QString(QString::fromLocal8Bit(cstr.c_str()));
 
//从QString 到 std::string
cstr = string((const char *)qstring.toLocal8Bit());

参考 

C++ 解决string转为char*中文乱码问题_char* 中文乱码-CSDN博客

突破编程_C++_字符串算法(判断字符串是否包含)_c++判断字符串是否含有某字符串-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/540476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++类和对象】上篇

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Xilinx Zynq UltraScale+ MPSoC无人机控制器

官方术语是无人驾驶飞行器&#xff08;UAV&#xff09;&#xff0c;这显然有点拗口&#xff0c;所以我们更喜欢说无人机。在过去的几十年里&#xff0c;无人机技术有了巨大的进步。我们为一个客户开发了一个无人机的飞行和视频控制器。 客户挑战 客户需要一种混合FPGA/CPU硬件&…

idea keymap用eclipse的相关快捷键

idea快捷键用eclipse的方式 CtrlShiftR 搜索文件 shiftshift 全部文件/类搜索 CtrlH 全局搜索 CtrlO 快速打开Outline大纲视图 ctrle 查看recent窗口文件 ctrlt 快速进入接口的实现类 ctrlshiftf 格式化代码 altshiftr 变量或函数的重命名 ctrlshifto 移除无用的头文…

MySQL基础知识——MySQL日志

一条查询语句的执行过程一般是经过连接器、 分析器、 优化器、 执行器等功能模块&#xff0c; 最后到达存储引擎。 那么&#xff0c; 一条更新语句的执行流程又是怎样的呢&#xff1f; 下面我们从一个表的一条更新语句进行具体介绍&#xff1a; 假设这个表有一个主键ID和一个…

MySQL:MySQL的查询(上)

文章目录 MySQL的增加单行数据插入多行数据插入插入否则更新替换 MySQL的查询select列where语句 本篇开始总结的是MySQL当中的基本查询语句 对于数据库的查询&#xff0c;无非大致就是增删查改&#xff0c;因此对于这些内容进行一一解释&#xff1a; MySQL的增加 单行数据插…

Redis中的集群(九)

集群 消息 集群中的各个节点通过发送和接收消息(message)来进行通信&#xff0c;我们称发送消息的节点为发送者(sender),接收消息 的节点成为接收者&#xff0c;如图所示。节点发送的消息主要有以下五种: 1.MEET消息:当发送者接到客户端发送的CLUSTER MEET命令时&#xff0c…

二叉树练习day.8

235.二叉搜索树的最近公共祖先 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共…

一起找bug之购物

如果不是购物车满了&#xff0c;大概都不会发现这个 bug 淘宝 APP 修复了购物车满的情况下&#xff0c;往里面添加新商品时&#xff0c;会把一个老商品移入收藏夹&#xff0c; 但是如果这个老商品是已失效状态&#xff0c;就无法自动移入收藏夹&#xff0c;而且会一直在购物车…

AI禁区徘徊监测识别摄像机

AI禁区徘徊监测识别摄像机是一种基于人工智能技术的智能监控设备&#xff0c;用于监测禁止进入或逗留的区域。这种摄像机通过高清摄像头实时捕捉场景图像&#xff0c;利用AI算法对人员徘徊行为进行识别和监测&#xff0c;有助于提高安全防范水平&#xff0c;减少潜在的安全风险…

【DL水记】循环神经网络RNN的前世今生,Transformer的崛起,Mamba模型

文章目录 RNN网络简介传统RNN网络结构RNN的分类 长-短期记忆网络 (LSTM)GRU网络横空出世的Transformer网络Self-AttentionVisionTransformer Mamba模型Reference: RNN网络简介 “当人类接触新事物时&#xff0c;他们不会从头开始思考。就像你在阅读这篇文章时&#xff0c;你会根…

基于springboot仿雀语的文档管理系统

项目介绍 本项目借鉴了雀语的一些UI设计&#xff0c;实现了文档在线管理的功能&#xff0c;知识库可以对不同分类的文档建立不同的库&#xff0c;知识库里面左边可以维护菜单菜单目录&#xff0c;右边实现在线预览。该项目可以防止用户下载和复制文档&#xff0c;只支持在线预…

Excel从零基础到高手【办公】

第1课 - 快速制作目录【上篇】第1课 - 快速制作目录【下篇】第2课 - 快速定位到工作表的天涯海角第3课 - 如何最大化显示工作表的界面第4课 - 给你的表格做个瘦身第5课 - 快速定位目标区域所在位置第6课 - 快速批量填充序号第7课 - 按自定义的序列排序第8课 - 快速删除空白行第…

接招吧! selenium环境+元素定位大法

selenium 与 webdriver Selenium 是一个用于 Web 测试的工具&#xff0c;测试运行在浏览器中&#xff0c;就像真正的用户在手工操作一样。支持所有主流浏览器 WebDriver 就是对浏览器提供的原生API进行封装&#xff0c;使其成为一套更加面向对象的Selenium WebDriver API。 …

UltraScale 架构 SelectIO 资源之IODELAY与IOSERDES仿真与使用

平台&#xff1a;vivado2018.3 具体内容见ug571-ultrascale-selectio IDELAYE3 在调试超高速信号的时候&#xff0c;需要使用iodelayiserdes来调试校准输入信号。例如外部某ADC采样率为5GHZ&#xff0c;外部ADC使用2.5GHZ的时钟去采集输入信号。为了实现采集&#xff0c;adc芯…

普乐蛙VR航天体验馆设备VR太空飞船VR元宇宙展厅

三天小长假就要来啦&#xff01;五一假期也即将到来。老板们想捉住人流量这个财富密码吗&#xff1f;那快快行动起来&#xff01;开启VR体验项目&#xff0c;假期赚翻天&#xff01;小编亲测&#xff01;&#xff01;这款设备刺激好玩&#xff0c;想必会吸引各位家长小孩、学生…

Normalization

Norm介绍 归一化层&#xff0c;目前主要有这几个方法&#xff0c;Batch Normalization&#xff08;2015年&#xff09;、Layer Normalization&#xff08;2016年&#xff09;、Instance Normalization&#xff08;2017年&#xff09;、Group Normalization&#xff08;2018年&…

【研发日记】CANoe自动化测试的配置方式(三)——SystemVariables数组方式

文章目录 前言 一、例程功能 二、仿真ECU 三、SystemVariables数组&#xff1a; 四、测试模块 五、测试运行效果 六、分析和应用 总结 前言 近期在做的一个自动化测试项目&#xff0c;尝试了一种以前没用过的测试配置方式&#xff0c;感觉效果还不错。然后又回顾了一下以…

php其他反序列化知识学习

简单总结一下最近学习的&#xff0c;php其他的一些反序列化知识 phar soap session 其他 __wakeup绕过gc绕过异常非公有属性&#xff0c;类名大小写不敏感正则匹配&#xff0c;十六进制绕过关键字检测原生类的利用 phar 基础知识 在 之前学习的反序列化利用中&#xff0…

Golang | Leetcode Golang题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; func removeNthFromEnd(head *ListNode, n int) *ListNode {dummy : &ListNode{0, head}first, second : head, dummyfor i : 0; i < n; i {first first.Next}for ; first ! nil; first first.Next {second second.Next}second.N…

谷歌推出适用于安卓设备的“Find My Device”网络,功能类似苹果Find My

谷歌今日推出了适用于安卓设备的“Find My Device”网络&#xff0c;其功能类似于苹果的“Find My”网络&#xff0c;旨在帮助用户定位丢失、被盗的安卓产品。 安卓的“Find My Device”网络可以利用数以亿计运行 Android 9 或更高版本的安卓设备&#xff0c;通过蓝牙信号追踪丢…