TC官方合作论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: awlbm

[已解决] \xe4\xba\xa7\xe5\x93\x81\xe5\x9b\xbe\xe7\x89\x87怎么转换成原来的中文

[复制链接]
 楼主| 发表于 2018-12-29 04:24:03 | 显示全部楼层
结果不对 答案应该是“产品图片”
QQ图片20181228203006.png
回复 支持 反对

使用道具 举报

发表于 2018-12-29 20:17:36 | 显示全部楼层
本帖最后由 minews 于 2018-12-29 20:49 编辑

\x... 这类编码 展开成对应的二进制 实际上是utf-8编码  TC用的是unicode(utf-16),转换一下即可
tc7.0下面释放结构体的时候出现崩溃,释放com对象也出现崩溃(所以相关代码已经注释掉),不知道是不是我电脑问题(windows 10),题主测试如果没有崩溃问题可以告知下


upload.jpg

function start_click()
    var str = "\\xe4\\xba\\xa7\\xe5\\x93\\x81\\xe5\\x9b\\xbe\\xe7\\x89\\x87"
    var arr = regexsubmatchtext(str, "x([a-fA-F0-9]{2})", true, true, false, true)
    var len = arraysize(arr)
    var bytes = array()
    for(var i = 0; i < len; i++)
        bytes[ i ] = array("byte" = 1, "value" = hex2dec(arr[ i ]))
    end
    bytes[len] = array("byte" = 1, "value" = 0)
    var addr = structmalloc(bytes)
    var txt = utf_8ToUnicode(addr)
    //jsNumberClass = null //tc7.0运行后崩溃
    traceprint(txt)
    //structfree(addr) //tc7.0运行后崩溃 原因未知?
end
function utf_8ToUnicode(addr)
    var length = MultiByteToWideChar(65001, 0, addr, -1, 0, 0)
    var addr1 = new(2 * cint(length))
    MultiByteToWideChar(65001, 0, addr, -1, addr1, length * 2)
    var str = addressvalue(addr1, "wchar *")
    //structfree(addr1) //7.0运行后崩溃 原因未知?
    return str
end
function new(size)
    var arr = array("newBytes" = array("byte" = size, "value" = 0))
    var addr = structmalloc(arr)   
    return addr
end
function MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cchMultiByte, lpWideCharStr, cchWideChar)
    var ret = dllcall("kernel32.dll", "long", "MultiByteToWideChar", "long", CodePage, "long", dwFlags, "long", lpMultiByteStr, "long", cchMultiByte, "long", lpWideCharStr, "long", cchWideChar)
    return ret
end

//js进制转换相关代码
var jsNumberClass = null
function initjsNumberClass()
    if(jsNumberClass == null)
        jsNumberClass = com("MSScriptControl.ScriptControl")
        jsNumberClass.AllowUI = true
        jsNumberClass.Language = "JavaScript"
        var jstxt = "function change(num,m,n){var s=num+'';var result=parseInt(s,m).toString(n);return result;}function bit(type,a,b){switch(type){case'and':return a&b;case'or':return a|b;case'xor':return a^b;case'right':return a>>b;case'left':return a<<b;default:return'';}}"
        var ret = jsNumberClass.ExecuteStatement(jstxt)
        traceprint(ret)
    end
end
function hex2dec(number)
    initjsNumberClass()
    return jsNumberClass.Eval("change('" & number & "',16,10)")
end
function dec2hex(number)
    initjsNumberClass()
    return jsNumberClass.Eval("change('" & number & "',10,16)")
end
function xor(a, b)
    initjsNumberClass()
    return jsNumberClass.Eval("bit('xor'," & a & "," & b & ")")
end
function and(a, b)
    initjsNumberClass()
    return jsNumberClass.Eval("bit('and'," & a & "," & b & ")")
end
function or(a, b)
    initjsNumberClass()
    return jsNumberClass.Eval("bit('or'," & a & "," & b & ")")
end
function right(a, b)
    initjsNumberClass()
    return jsNumberClass.Eval("bit('right'," & a & "," & b & ")")
end
function left(a, b)
    initjsNumberClass()
    return jsNumberClass.Eval("bit('left'," & a & "," & b & ")")
end


回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-29 04:27:34 | 显示全部楼层
剑仙十号 发表于 2018-12-28 22:08
var str0 = "\\xe4\\xba\\xa7\\xe5\\x93\\x81\\xe5\\x9b\\xbe\\xe7\\x89\\x87"
str0 = 字符串修剪(str0,  ...

结果不对 答案应该是“产品图片”

辛苦了!麻烦再看看
回复 支持 反对

使用道具 举报

发表于 2018-12-29 22:00:25 | 显示全部楼层
本帖最后由 剑仙十号 于 2018-12-29 22:02 编辑

编码类。UTF-8与Unicode相互转换
\xe4\xba\xa7\xe5\x93\x81\xe5\x9b\xbe\xe7\x89\x87
minews :
\x... 这类编码 展开成对应的二进制 实际上是utf-8编码  TC用的是unicode(utf-16),转换一下即可

作者 :追逐
//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
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-29 22:55:30 | 显示全部楼层
感谢minews  感谢剑仙十号

没想到C语音中一句代码就可以解决的事情  到tc有这么复杂!说穿了  还是要有语言基础!

to minews:
感谢你的代码 学习了!能够满足我的转换要求!
经过测试:在win7 64位 tc7中,原代码3处去掉注释,除了在structfree(addr1)这行崩溃,其余2处未崩溃;又测试:在注释掉 MultiByteToWideChar(65001, 0, addr, -1, addr1, length * 2)这行,运行structfree(addr1),不崩溃,但是,解出来的str是乱码

再次感谢剑仙十号、minews!
回复 支持 反对

使用道具 举报

发表于 2018-12-29 23:12:08 | 显示全部楼层
awlbm 发表于 2018-12-29 22:55
感谢minews  感谢剑仙十号

没想到C语音中一句代码就可以解决的事情  到tc有这么复杂!说穿了  还是要有语 ...

ok 我还以为是我电脑问题
换到tc 8.0 运行正常估计是tc7.0 的某种bug吧
回复 支持 反对

使用道具 举报

发表于 2018-12-30 11:15:22 | 显示全部楼层
剑仙十号 发表于 2018-12-29 22:00
编码类。UTF-8与Unicode相互转换
\xe4\xba\xa7\xe5\x93\x81\xe5\x9b\xbe\xe7\x89\x87
minews :

剑仙 调试一下看看输出对不对,
你上面贴的代码看起来是  UTF-8 和 ANSI互转
并不是Unicode 和UTF-8 互转
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

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

GMT+8, 2024-4-27 07:31 , Processed in 0.058322 second(s), 22 queries .

Powered by 海安简单软件服务部

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

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