ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 名课 - Power BI数据分析与可视化实战 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: hnyylx

[求助] 如何将附件中的16进制编码的字符转换成汉字

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-1-20 16:45 | 显示全部楼层
sz_wap 发表于 2015-1-20 13:36

这个是正常字符转为UTF码的自定义函数:
  1. Function GetUTF$(txt$)
  2.     For i = 1 To Len(txt)
  3.         t = AscW(Mid(txt, i, 1)): If t < 0 Then t = 65536 + t
  4.         If t < 128 Then GetUTF = GetUTF & Hex(t) Else GetUTF = GetUTF & "e" & Hex(t \ 4096) & Hex((t \ 64) Mod 64 + 128) & Hex(t Mod 64 + 128)
  5.     Next
  6. End Function
复制代码
加码计算原理:
<128的直接用2位16进制数表示,
其它字符的AscW码值,按照64进制转换为3组10进制数,
然后,第1组转16进制并添加前导"e" (相当于10进制数+224或16进制"E0")
而第2和第3组的10进制数还要加上128(保证和<128的字符区分开来),然后再转为2位的16进制字符。
转换后的3组拼接字符即是UTF码。

TA的精华主题

TA的得分主题

发表于 2015-1-20 17:05 | 显示全部楼层
sz_wap 发表于 2015-1-20 16:33
附件代码是以前从网上找的
主要处理形如:%E6%B5%8B%E8%AF%95abc123之类的Url字符串
其中包含汉字的UTF ...

你的“拿来主义”的代码水平比较低……

一是进制转换效率太低,二是算法不简明……转码的原理没能搞懂吧。

…………
说实话我之前也不知道UTF是怎么回事,但看了你拿来的代码,分析一下就明白了。

TA的精华主题

TA的得分主题

发表于 2015-1-21 11:13 | 显示全部楼层
香川群子 发表于 2015-1-20 17:05
你的“拿来主义”的代码水平比较低……

一是进制转换效率太低,二是算法不简明……转码的原理没能搞懂 ...

转成2进制后截位,大概源于C语言,因为C可以进行位操作。
VB里应该是四则运算效率更高。

需要注意的是,UTF-8可变长,从通用性角度,还要考虑2字节的UTF8码

TA的精华主题

TA的得分主题

发表于 2015-1-21 11:57 | 显示全部楼层
sz_wap 发表于 2015-1-21 11:13
转成2进制后截位,大概源于C语言,因为C可以进行位操作。
VB里应该是四则运算效率更高。

UTF-8码确实还有各种其它形式。

但这就不是一般的字符串转换要求了。
仅从字符转换角度考虑,还是用我的方法就足够了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-21 13:10 | 显示全部楼层
香川群子 发表于 2015-1-20 15:25
你的转换函数太复杂了。也许是因为你为了通用性而过多地考虑了其它异常处理。

我看懂了你的转换原理, ...

香川老师,您真的太神奇了,代码写得如此简洁!我想再请教您一下:您在对连续6个16进制码转为1个ChrW字符时,每两个16进制码为一组分别转为2进制码,然后分别将每组二进制码提取第1个"0"以后的有效字符,再然后将他们合并连接为一个2进制数,最后又通过BinToDec将这个合并后的2进制数转为10进制数,再通过ChrW将10进制数转为汉字。
以上将每组二进制码提取第1个"0"以后的有效字符合并为一个二进制数,能否麻烦解释下为啥要提取第1个"0"以后的有效字符合并?

TA的精华主题

TA的得分主题

发表于 2015-1-21 16:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
hnyylx 发表于 2015-1-21 13:10
香川老师,您真的太神奇了,代码写得如此简洁!我想再请教您一下:您在对连续6个16进制码转为1个ChrW字符 ...

你这说的还是我8楼的转换代码吧。

请先看一下9楼的转换代码,更简单。计算过程我也已经说明了。

…………
原因在于:
UTF-8对ChrW字符编码时,为了保证每2个16进制数不被当做<128的普通Chr字符(即基本ASC字符)
所以,对于后两组(即第3第4位的第2组16进制数,以及第5第6位的第3组16进制数)
会在编码时加上128以作区别。

而128的二进制码为10000000 所以8个2进制数位长度中的第1第2位是不需要的。
可以直接截取掉。

而截取算法,就可以是找到第1个0(实际左起第2个数位)以后截取其后的第3个数位开始的二进制数值即可。

…………
这样其实很麻烦,所以我在9楼的代码中,就直接用16进制数换算为10进制数以后,直接减去128就可以了。

这两种处理方法,实际效果是一样的。

TA的精华主题

TA的得分主题

发表于 2015-1-21 16:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
UTF编码过程中,第3第4位以及第5第6位的2组16进制数的最大值,只有64( 即0-63)
对应二进制码最大63为=111111,加上128以后是:10111111

所以,找到二进制数中第1个零以后开始的数,或者直接截取二进制数的后6位,
或者把16进制数转为10进制数后再减去128……这些都是一样的效果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-22 14:13 | 显示全部楼层
香川群子 发表于 2015-1-21 16:07
UTF编码过程中,第3第4位以及第5第6位的2组16进制数的最大值,只有64( 即0-63)
对应二进制码最大63为=1111 ...

香川大师,在您的点拨下,我把您写的代码都看完看懂了,不得不佩服您写代码的功夫如此高深,我获益很多,非常感谢您!在此再和您探讨下(与目前的工作需求暂时没有关系,但是以后很可能会碰到):
我在想:反过来,要是下回碰到要将一堆字母汉字要转为UTF码,这个自定义函数该如何写呢?网上我查到一个,但是只能把汉字转为UTF码,字母及其他符号就没法转了。而且代码写得也比较复杂,没有您写的代码那么精简,要不香川大师再劳驾您秀一下?

点评

你就没有看过11楼帖子的代码吗……字符串转UTF-8码  发表于 2015-1-22 15:29

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-22 14:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hnyylx 发表于 2015-1-22 14:13
香川大师,在您的点拨下,我把您写的代码都看完看懂了,不得不佩服您写代码的功夫如此高深,我获益很多, ...

Function UTF8EncodeURI(szInput)
Dim wch, uch, szRet
Dim x
Dim nAsc, nAsc2, nAsc3
If szInput = "" Then
UTF8EncodeURI = szInput
Exit Function
End If
For x = 1 To Len(szInput)
wch = Mid(szInput, x, 1)
nAsc = AscW(wch)
If nAsc < 0 Then nAsc = nAsc + 65536
If (nAsc And &HFF80) = 0 Then
szRet = szRet & wch
Else
If (nAsc And &HF000) = 0 Then
uch = "%" & Hex(((nAsc \ 2 ^ 6)) Or &HC0) & Hex(nAsc And &H3F Or &H80)
szRet = szRet & uch
Else
uch = "%" & Hex((nAsc \ 2 ^ 12) Or &HE0) & "%" & _
Hex((nAsc \ 2 ^ 6) And &H3F Or &H80) & "%" & _
Hex(nAsc And &H3F Or &H80)
szRet = szRet & uch
End If
End If
Next
UTF8EncodeURI = szRet
End Function
以上是我在网山搜到的汉字转UTF的代码,供参考。

TA的精华主题

TA的得分主题

发表于 2015-8-5 17:48 | 显示全部楼层
感谢香川群子老师,看了你的帖子解决了我一个好久的问题了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-12-25 02:59 , Processed in 0.026171 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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