TC官方合作论坛

 找回密码
 立即注册
查看: 1335|回复: 1

[已解决] ansi如何转换为utf-8

[复制链接]
发表于 2018-1-6 15:31:29 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
详细如下,在写自动上号功能时,需要建角色,我想用内存实现,于是:在vc中我可以这样写

        char *roleName=ANSItoUTF8("右右右可");
        CreateRole(roleName);

但是我想把这样的功能写在tc中,于是就碰到了如何将ansi转换为utf-8,初学者,请各位指点一下,不胜感激
回复

使用道具 举报

发表于 2018-1-9 22:45:05 | 显示全部楼层
//UTF-8 转 Unicode
function A2W(szU8)
    var wcsLen = MultiByteToWideChar(CP_UTF8,null,szU8,strlenA(szU8),null,0)
    var wszString = new(wcsLen+1,"wchar")  
    memset(wszString,0,wcsLen+1)   
    MultiByteToWideChar(CP_UTF8, null, szU8, strlenA(szU8), wszString, wcsLen)
    memset(wszString+wcsLen*2, 0, 1)
    var str
    str = getvoid(wszString,"wchar *")
    delete(wszString)
    return str
end
//Unicode 转 UTF-8
function W2A(unicode)
    var len = WideCharToMultiByte(CP_UTF8,0,unicode,-1,null,0,null,null)
    var szUtf8 = new(len+1,"char")
    memset(szUtf8, 0, len + 1)
    WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, null, null)
    memset(szUtf8+len, 0, 1)
    var str
    str = getvoid(szUtf8,"char *")
    delete(szUtf8)
    return str
end

function strlenA(str)
    return dllcall("Kernel32.dll","long","lstrlenA","char *",str)
end

function strlenW(str)
    return dllcall("Kernel32.dll","long","lstrlenW","wchar *",str)
end


function MultiByteToWideChar(CodePage,dwFlags,lpMultiByteStr,cchMultiByte,lpWideCharStr,cchWideChar)
    //int MultiByteToWideChar(
    //UINT CodePage,
    //DWORD dwFlags,
    //LPCSTR lpMultiByteStr,
    //int cchMultiByte,
    //LPWSTR lpWideCharStr,
    //int cchWideChar
    //);
    return dllcall("kernel32.dll", "long", "MultiByteToWideChar", "long", CodePage, "long", dwFlags,"char *", lpMultiByteStr,"long", cchMultiByte,"long", lpWideCharStr,"long", cchWideChar)
end

function WideCharToMultiByte(CodePage,dwFlags,lpWideCharStr,cchWideChar,lpMultiByteStr,cchMultiByte,lpDefaultChar,pfUsedDefaultChar)
    //int WideCharToMultiByte(
    //UINT CodePage, //指定执行转换的代码页
    //DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符
    //LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区
    //int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数
    //LPSTR lpMultiByteStr, //指向接收被转换字符串的缓冲区
    //int cchMultiByte, //指定由参数lpMultiByteStr指向的缓冲区最大值
    //LPCSTR lpDefaultChar, //遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数指向的字符
    //LPBOOL pfUsedDefaultChar //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE
    //);
    return dllcall("kernel32.dll", "long", "WideCharToMultiByte", "long", CodePage, "long", dwFlags,"wchar *", lpWideCharStr,"long", cchWideChar,"long", lpMultiByteStr,"long", cchMultiByte,"long",lpDefaultChar,"long",pfUsedDefaultChar)
   
   
end
var CP_UTF8=65001
//////////////////////////////////////////////////
//申请内存地址//一定要delete 否则内存泄漏
function new(nSize,type)
    var void = array()
    select(type)
        case "char"
        void["void"] = array("char" = nSize, "value" = "")
        case "wchar"
        void["void"] = array("wchar" = nSize, "value" = "")
        case "long"
        void["void"] = array("long" = nSize, "value" = "")
        case "short"
        void["void"] = array("short" = nSize, "value" = "")
        default
        traceprint("******************")
        traceprint("**** new 空缺*****")
        traceprint("******************")
    end
    return structmalloc(void)
end

//释放内存
function delete(address)
    structfree(address)
end

//重置一段内存中值
function memset(address, value, nSize)
    return dllcall("kernel32.dll", "long", "RtlFillMemory", "long", address, "long", nSize, "long", value)
end

功能 memcopy(Destination,Source,nSize)
    var ret =  dllcall("Kernel32.dll","long","RtlMoveMemory","long",Destination,"long",Source,"long",nSize)
    traceprint(获取错误信息(1))
    return ret
结束


功能 memcopy_byte(Destination,Source,nSize)
    var ret =  dllcall("Kernel32.dll","long","RtlMoveMemory","byte",Destination,"long",Source,"long",nSize)
    traceprint(获取错误信息(1))
    return ret
结束
//内存获取值
function getvoid(address,type)
    return addressvalue(address, type)
end
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-19 15:54 , Processed in 0.039242 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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