lengshizai 2024-02-22 12:33 采纳率: 31.7%
浏览 20
已结题

C++对比不同编码下相同字符串

两个读取出的字符完全一样,但就是不能划等号; 但是同一个应用程序中,其他部位 同样时汉字 却匹配了?
附图 1 图2

看差别
看代码别疑惑 学习用 我没那胆子

switch (周围对象类型)
{
//  周围对象名  是预定输入的检索对比对象 字符串1
//    解析周围对象名称 是内存中读取出 字符串2

    case 1:
    周围对象偏移 = 0x87D0;
    
    case 2:
    {周围对象偏移 = 0x87F0;
    std::string 解析周围对象名称 = (char*)(周围对象 + 周围对象偏移);
    std::string    解析周围对象名 = StdStringToGBK(周围对象名); //UTF8toGBK
    printf("TargetName:%s   %d\n\n", 解析周围对象名.c_str(), 解析周围对象名.length());
    printf("MemoryName:%s   %d\n\n", 解析周围对象名称.c_str(), 解析周围对象名称.length());
    if (解析周围对象名称.find(周围对象名) != 解析周围对象名称.npos)            
    {
        printf("successful: 0x%X ", 周围对象);
        返回值 = 周围对象;
        return 返回值;
        break;
    }周围链表节点 = *(DWORD*)(周围链表节点);
    break;
    }
    case 3:
    {周围对象偏移 = 0x87C4;
    std::string     解析周围对象名称 = (char*)(周围对象 + 周围对象偏移);
    std::string    解析周围对象名 = StdStringToGBK(周围对象名);
    printf("TargetName:%s\n\n", 解析周围对象名.c_str());
    printf("MemoryName:%s\n\n", 解析周围对象名称.c_str());
    if (解析周围对象名称.find(解析周围对象名) != 解析周围对象名称.npos)
    {
        printf("successful: 0x%X ", 周围对象);
        返回值 = 周围对象;
        return 返回值;
    }周围链表节点 = *(DWORD*)(周围链表节点);
    break; }
}

img


img

谁能解解惑 并提出建设性意见; 这是 同一个程序对不同部分采取不同编码 还是我个人代码错误?

  • 写回答

17条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-02-22 12:35
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供!
    您可以参考如下,如果回答的不正确,及时评论区回复我,我会根据你错误描述追加回复。如果解决了您的问题,麻烦帮我点击个采纳!谢谢您的肯定!

    从你的描述和代码片段来看,你可能遇到了字符编码的问题。StdStringToGBK这个函数看起来是将UTF-8编码的字符串转换为GBK编码。在你的例子中,有些情况下字符串匹配成功,有些则不成功,这可能是因为不同的字符串实际上有不同的编码。

    在C++中处理字符串编码问题可以很复杂,特别是在涉及到多种编码格式时。以下是一些可能的解决方案:

    1. 确保所有的字符串都使用相同的编码。如果你的程序需要处理多种编码,你需要在读取或写入字符串时明确指定编码。

    2. 使用库来处理编码转换。例如,你可以使用iconv库或者 Boost.Locale库来进行编码转换。

    3. 在比较字符串之前,确保它们都被转换到同一种编码。在这个例子中,如果周围对象名是UTF-8编码,那么解析周围对象名称也应该被转换为UTF-8再进行比较。

    4. 检查StdStringToGBK函数是否正确实现了UTF-8到GBK的转换。如果有问题,你可能需要修复这个函数。

    这里是一个使用Boost.Locale库进行编码转换的例子:

    #include <boost/locale.hpp>
    
    std::string utf8_to_gbk(const std::string& utf8_str) {
        std::locale loc("en_US.UTF-8");
        return boost::locale::conv::utf_to_gbk(utf8_str, loc);
    }
    
    std::string gbk_to_utf8(const std::string& gbk_str) {
        std::locale loc("en_US.UTF-8");
        return boost::locale::conv::gbk_to_utf8(gbk_str, loc);
    }
    
    // 使用转换函数
    std::string utf8_name = "周仓";
    std::string gbk_name = utf8_to_gbk(utf8_name);
    
    // 现在可以比较GBK编码的字符串
    if (解析周围对象名称 == gbk_name) {
        // 匹配成功
    }
    

    请注意,这段代码需要Boost库,并且你的环境需要支持UTF-8编码。如果不能使用Boost,你需要找到一个替代的编码转换方法。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(16条)

报告相同问题?

问题事件

  • 请采纳用户回复 6月2日
  • 系统已结题 3月1日
  • 已采纳回答 2月22日
  • 创建了问题 2月22日

悬赏问题

  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3