免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: pinkkyone
打印 上一主题 下一主题

困扰很久的编码问题求教(已解决,谢谢大家!) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2015-11-03 16:08 |只看该作者
问题解决,原来这是Win32::IEAutomation的一个Bug,具体见如下描述:

Win32::IEAutomation uses Win32::OLE to all the work, but leaves its
option that specifies how to handle Perl UTF-8 stirngs set by default,
which makes Win32::OLE treat them as they were sequence of bytes in
Windows current ANSI codepage. This makes impossible to use UTF-8
strings in calls to SetValue() and other similar methods. Since IE (as
well as most other MS' own application) to support Unicode data from OLE
correctly, UTF-8 support in Win32::OLE should be enabled by
Win32::IEAutomation. This is backwards compatible change, as scripts
that try to use current CP pass strings as sequence of bytes and this
change only affect handling of "true" UTF-8 strings.

在IEAutomation.pm的代码
sub _startIE{
        my ($self, $visible, $maximize) = @_;
        defined $self->{agent} and return;

之后添加:
Win32::OLE->Option(CP=>Win32::OLE::CP_UTF;

后,现测试完美解决。

谢谢大家,遇到同样问题的可以参考。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
12 [报告]
发表于 2015-11-03 16:58 |只看该作者
那么就要看你原生字符串的编码格式了,难道是 gbk, utf-8 混合形式吗? 这样的文本只能自己设计字符集的转换。
  1. for my $char (@chars) {
  2.    if (ord($char) ~~ @gbk_range) { ... }
  3.    if (ord($char) ~~ @latin_range) { ... }
  4. }
复制代码

论坛徽章:
0
13 [报告]
发表于 2015-11-03 17:13 |只看该作者
回复 12# 104359176

字符串编码时utf8,按11楼的方法已完美解决,刚测试了没有问题。
这个应该是IEAutomation的一个bug。

   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
14 [报告]
发表于 2015-11-03 17:30 |只看该作者
微软系列的中文处理软件大都默认是 gbk 编码,而国际开源软件通用是的 utf-8 编码。windows 自带的记事本就是一个例子,UE 也是一样。我用 Vim 写代码,中文注释部分在记事本和 UE 中显式的都是乱码。用 UE 修改保存后,中文信息就彻底销毁了。

论坛徽章:
0
15 [报告]
发表于 2015-11-03 17:45 |只看该作者
回复 14# 104359176

多谢回复。
我再总结下,我的这问题是这样的,Win32::IEAutomation在进行SetValue等操作时,对于程序提供给它的字符串,不管字符串采用什么编码,都会按照当前操作系统所用的codepage来解码,以我的系统来举例,我是简中的windows操作系统,SetValue就会按gbk对要设置的字符串进行解码。

原因应该是这样的,IEAutomation在启动IE时,未指定IE的字符集选项,而是采用当前操作系统所用的codepage来解码(这点我测试过,切换到韩语操作系统时,韩文字符就可以正确解码)。

解决方法也很简单,在IEAutomation的启动IE语句后添加编码指定部分(11楼所示),指定utf8,就可以在进行SetValue等操作时使用unicode字符了,当然,你set的字符串必须采用utf8编码,并设置Encode::_utf8_on


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP