开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 205|回复: 2
收起左侧

[已解决] 编码_Unicode到Ansi C++版

 关闭 [复制链接]
结帖率:91% (21/23)
发表于 2025-11-1 14:19:11 | 显示全部楼层 |阅读模式   江苏省淮安市
12精币
  
子程序名返回值类型公开备 注
编码_Unicode到Ansi文本型 将Unicode码转换为Ansi码;成功返回转换后的文本;
参数名类 型参考可空数组备 注
Unicode字节集欲转换的Unicode字节集
变量名类 型静态数组备 注
局_计数整数型 
局_结果数据字节集 
局_结果文本文本型 
局_计数 = 取字节集长度 (Unicode) ÷ 2  ' 字符数目两个
局_计数 = WideCharToMultiByte_整数 (936, 512, 取指针_字节集型 (Unicode), 局_计数, 0, 0, 0, 0)  ' 取转换后的数目
局_结果数据 = 取空白字节集 (局_计数)
WideCharToMultiByte_整数 (936, 512, 取指针_字节集型 (Unicode), -1, 取指针_字节集型 (局_结果数据), 局_计数, 0, 0)
局_结果文本 = 取字节集数据 (局_结果数据, #文本型, )
返回 (局_结果文本)
子程序名返回值类型公开备 注
取指针_字节集型整数型 取到的是变量堆地址,和 取变量数据地址() 一样
参数名类 型参考可空数组备 注
字节集字节集
置入代码 ({ 139, 69, 8, 139, 0, 133, 192, 15, 132, 3, 0, 0, 0, 131, 192, 8, 201, 194, 4, 0 })
返回 (0)
DLL命令名返回值类型公开备 注
WideCharToMultiByte_整数整数型 
DLL库文件名:
kernel32.dll
在DLL库中对应命令名:
WideCharToMultiByte
参数名类 型传址数组备 注
CodePage整数型
Options整数型
WideCharStr整数型
WideCharCount整数型
MultiByteStr整数型
MultiByteCount整数型
pDefaultChar整数型
pDefaultCharUsed整数型


上面是精益里的编码_Unicode到Ansi 现在我想要将他转成C++ 传入参数是PBYET类型

最佳答案

查看完整内容

DeepSeek是摆设吗 [mw_shl_code=cpp,true]#include #include /** * @brief 将Unicode字符串转换为Ansi字符串 * @param pUnicodeData 指向Unicode字符串数据的指针(PBYTE类型) * @param dataSize 数据大小(以字节为单位),如果为0则自动计算字符串长度 * @Return 转换后的Ansi字符串,如果转换失败返回空字符串 */ std::string UnicodeToAnsi(PBYTE pUnicodeData, int dataSize = 0) { // 检查输入参数有效性 if ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值
结帖率:96% (26/27)

签到天数: 7 天

发表于 2025-11-1 14:19:12 | 显示全部楼层   河南省新乡市
DeepSeek是摆设吗
[C++] 纯文本查看 复制代码
#include <windows.h>
#include <string>

/**
 * @brief 将Unicode字符串转换为Ansi字符串
 * @param pUnicodeData 指向Unicode字符串数据的指针(PBYTE类型)
 * @param dataSize 数据大小(以字节为单位),如果为0则自动计算字符串长度
 * @Return 转换后的Ansi字符串,如果转换失败返回空字符串
 */
std::string UnicodeToAnsi(PBYTE pUnicodeData, int dataSize = 0)
{
    // 检查输入参数有效性
    if (pUnicodeData == nullptr)
    {
        return "";
    }
    
    // 计算Unicode字符串长度
    int unicodeLen = 0;
    if (dataSize == 0)
    {
        // 如果未指定数据大小,自动计算以null结尾的字符串长度
        unicodeLen = wcslen(reinterpret_cast<LPCWSTR>(pUnicodeData));
    }
    else
    {
        // 如果指定了数据大小,计算字符数(注意:每个Unicode字符占2字节)
        unicodeLen = dataSize / sizeof(WCHAR);
    }
    
    // 检查字符串长度是否有效
    if (unicodeLen <= 0)
    {
        return "";
    }
    
    // 获取所需的Ansi缓冲区大小
    int ansiBufferSize = WideCharToMultiByte(
        CP_ACP,                    // 使用系统默认的Ansi代码页
        0,                         // 无特殊转换标志
        reinterpret_cast<LPCWSTR>(pUnicodeData),  // Unicode字符串指针
        unicodeLen,                // Unicode字符串长度
        nullptr,                   // 输出缓冲区(为null时计算所需大小)
        0,                         // 输出缓冲区大小
        nullptr,                   // 使用系统默认字符替代不可转换字符
        nullptr                    // 是否使用了默认字符
    );
    
    // 检查缓冲区大小计算是否成功
    if (ansiBufferSize == 0)
    {
        DWORD error = GetLastError();
        // 可以在这里添加错误处理逻辑
        return "";
    }
    
    // 分配Ansi字符串缓冲区
    std::string ansiResult;
    ansiResult.resize(ansiBufferSize);
    
    // 执行实际的编码转换
    int convertResult = WideCharToMultiByte(
        CP_ACP,                    // 使用系统默认的Ansi代码页
        0,                         // 无特殊转换标志
        reinterpret_cast<LPCWSTR>(pUnicodeData),  // Unicode字符串指针
        unicodeLen,                // Unicode字符串长度
        &ansiResult[0],            // 输出缓冲区
        ansiBufferSize,            // 输出缓冲区大小
        nullptr,                   // 使用系统默认字符替代不可转换字符
        nullptr                    // 是否使用了默认字符
    );
    
    // 检查转换是否成功
    if (convertResult == 0)
    {
        DWORD error = GetLastError();
        // 可以在这里添加错误处理逻辑
        return "";
    }
    
    return ansiResult;
}

/**
 * @brief 重载版本:直接接受wchar_t指针
 * @param pUnicodeStr Unicode字符串指针
 * @return 转换后的Ansi字符串
 */
std::string UnicodeToAnsi(LPCWSTR pUnicodeStr)
{
    if (pUnicodeStr == nullptr)
    {
        return "";
    }
    
    // 将wchar_t指针转换为PBYTE并调用主函数
    return UnicodeToAnsi(reinterpret_cast<PBYTE>(const_cast<LPWSTR>(pUnicodeStr)));
}

// 使用示例
void UsageExample()
{
    // 示例1:使用Unicode字符串
    wchar_t unicodeStr[] = L"这是一个Unicode字符串示例";
    
    // 方法1:直接使用wchar_t指针
    std::string ansiStr1 = UnicodeToAnsi(unicodeStr);
    
    // 方法2:使用PBYTE指针
    std::string ansiStr2 = UnicodeToAnsi(reinterpret_cast<PBYTE>(unicodeStr));
    
    // 方法3:使用PBYTE指针并指定数据大小
    std::string ansiStr3 = UnicodeToAnsi(
        reinterpret_cast<PBYTE>(unicodeStr), 
        sizeof(unicodeStr)
    );
    
    // 示例2:处理二进制数据中的Unicode字符串
    BYTE buffer[1024];
    // 假设buffer中包含Unicode字符串数据...
    // std::string result = UnicodeToAnsi(buffer, specifiedSize);
}

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:91% (21/23)

签到天数: 2 天

 楼主| 发表于 2025-11-1 14:22:57 | 显示全部楼层   江苏省淮安市
[C++] 纯文本查看 复制代码
std::string 编码_Unicode到Ansi(const BYTE* unicodeBytes)
{
    if (!unicodeBytes) return {};

    // 字节集长度(易语言里传进来的整块内存)
    int byteLen = 0;
    while (*(wchar_t*)(unicodeBytes + byteLen) != 0)  // 以双字节 0 结尾
        byteLen += sizeof(wchar_t);

    int charCount = byteLen / sizeof(wchar_t);        // 字符数

    // 第一次调用:获取转换后需要的字节数
    int cbNeeded = ::WideCharToMultiByte(
        936,            // GBK
        0,              // dwFlags
        (LPCWCH)unicodeBytes,
        charCount,
        nullptr, 0,
        nullptr, nullptr);
    if (cbNeeded <= 0) return {};

    // 分配缓冲区并真正转换
    std::vector<char> buf(cbNeeded);
    ::WideCharToMultiByte(
        936, 0,
        (LPCWCH)unicodeBytes, charCount,
        buf.data(), cbNeeded,
        nullptr, nullptr);

    return std::string(buf.data(), cbNeeded);
}



已解决,随便回复抽一个送了

评分

参与人数 1精币 +1 收起 理由
企鹅号525150138 + 1 优质内容,感谢分享!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

关闭

精易论坛 - 有你更精彩上一条 /2 下一条

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表