Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 18792|回复: 31

汉字转拼音的完美解决方案~

[复制链接]
发表于 2007-3-30 13:13 | 显示全部楼层 |阅读模式
<p>汉字转拼音的完美解决方案~<br/>err...至少是比较完美<br/>经测试在office xp,2003,2007通过。<br/><br/>'***************************************************************************<br/>'*<br/>'* MODULE NAME:&nbsp;&nbsp;&nbsp;&nbsp; HzToPy<br/>'* AUTHOR &amp; DATE:&nbsp;&nbsp; tt.t<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29 March 2007<br/>'*<br/>'* Usage:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Function HzToPy(HzStr as String) as String<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.g. Msgbox HzToPy("奥斯") will display ao4si1 with mspy2.0<br/>'*<br/>'*<br/>'* DESCRIPTION:&nbsp;&nbsp;&nbsp;&nbsp; 将中文字符串转换为拼音,就这些~<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有汉字得到拼音其实并不是我很关心的一个问题,只是发现已经公开<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的方法有很大的缺陷,但WORD却做得很好,因此才尝试解决这个问题。<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过程比我预期的要曲折的多,主要是VBA实在是一种很受限制的语言。<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过好在有Google和Olldbg,难题也仅仅是如何找到绕过限制的途径,<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 终于在5个小时内搞定了一切~<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时间比我预计的长了很多,因为我实在是不了解VBA,也不很熟悉OLE:"(<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过好在一切都解决了~~终于从VBA小白成长了一些。<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实VBA也是很强大的~<br/>'*<br/>'* Theory:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 废话了好多还是说说原理吧,虽然不是每个人都很关心~<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD的拼音向导能够将汉字转成拼音全是倚仗微软拼音的帮助,<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 微软拼音2.0以上版本都提供了汉字到拼音的转换功能。<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 微软拼音MSIME.China类中的IFELanguage接口具体实现了转换功能<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过MSIME.China中没有提供IDispatch接口,VBA的CreateObject不支持<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用这样的类,因此我们只好手工调用。CoCreateInstance可以创建类<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并获取IFELanguage接口,但我们无法直接调用,因为VBA不知道如何调用<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IFELanguage接口的Method。这里困扰了我好久,原本希望能向其他语言那样<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 声明接口结构,但VBA并不支持。万般无奈下只好在OLE相关DLL中寻找,期待能<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 找到代理函数简介调用接口的Method。呵呵~功夫不负苦心人终于在OLEAUT32中<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 找到了DispCallfunc。Google了一下,果然是我需要的。接口知道了,如何调用也<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清楚了,剩下的问题就是如何取得转换后的结果。IFELanguage.GetMorphResult会将<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转换的结果存在一个叫做tagMORRSLT的结构中,并返回指向tagMORRSLT的指针。<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 新问题又来了,VBA不支持指针...sigh,为什么其他语言很容易实现的功能VBA用起来<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就这么烦呢~幸好VBA读取内存的限制也好突破,只需调用ntdll的RtlMoveMemory。<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了~一切限制都已解除,HzToPy终于正常工作了~~<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说起来一切顺理成章,可是寻找解决方法的过程真的很痛苦,不过VBA经验值大涨也算有所收获。<br/>'*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面就让代码来说话吧。<br/>'*<br/>'*<br/>'***************************************************************************<br/><br/>在废话一下,用windows ime api也可以实现汉字到拼音,但是在WINPY.ime中有个bug,<br/>而且在2000 sp4~xp sp2一直存在,就是必须要将winnt\system32\winpy.mb考到系统盘根目录下才行。<br/>这个bug存在了如此长的时间,估计是MS有意为之,鄙视一下。<br/></p><p>ps:根据汉字内码确定其拼音范围的做法适用性查,对GBK的字符不适用,所以还是MS自家WORD的方法最好。</p><p><br/><br/></p>
 楼主| 发表于 2007-3-30 13:13 | 显示全部楼层

在Office 2007中,多义字可以正确转换,至少“怎么”可以正确转,office2003就不行。
回复

使用道具 举报

发表于 2007-3-30 21:16 | 显示全部楼层

<p>GOOD!</p><p>谢谢分享,呵呵.鲜花送上!</p>[em23][em23][em23]
回复

使用道具 举报

发表于 2007-4-2 03:15 | 显示全部楼层

<p>谢谢楼主。</p>
回复

使用道具 举报

发表于 2007-4-2 22:59 | 显示全部楼层

谢谢
回复

使用道具 举报

发表于 2007-4-2 23:07 | 显示全部楼层

高人,不知在EXCEL中是否实现同音字查询?
回复

使用道具 举报

发表于 2007-4-2 10:49 | 显示全部楼层

支持
回复

使用道具 举报

发表于 2007-4-3 10:25 | 显示全部楼层

非常好,支持一下.[em17][em17][em17]
回复

使用道具 举报

发表于 2007-4-10 17:08 | 显示全部楼层

[em23][em23][em23]
回复

使用道具 举报

发表于 2007-4-11 22:05 | 显示全部楼层

想知道怎么才能不显示音标只显示拼音字母呢?

想知道怎么才能不显示音标只显示拼音字母,楼主知道怎么办吗?<br/>
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-6 06:33 , Processed in 0.284099 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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