免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3940 | 回复: 14
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-02 10:22 |只看该作者 |倒序浏览
本帖最后由 pinkkyone 于 2015-11-03 16:24 编辑

因工作需要,使用Win32::IEAutomation打开某些网页并设置数据,然后提交,但在数据中含有unicode字符时,通过SetValue传送给网页的数据会变成乱码。

具体情况可简化为以下代码:

#!/usr/bin/perl
#use warnings;'
use utf8;
use Encode;
use File::Find;
use Win32::IEAutomation;
my $ie = Win32::IEAutomation->new( visible => 1, maximize => 1);
$ie->gotoURL("h\ttp\:\//w\ww\.baidu\.com/");
$ie->WaitforDone;
$string="黑莓도움말Coût mensuel";
#$string=encode(gbk,$string);
$ie->getTextBox('name:', "wd")->SetValue("$string");

操作系统为Windows XP,简体中文版,IE为IT8。
无论$string采用什么编码,通过SetValue传送给网页时,都会按gbk来解码,所以传送gbk不包含的字符时,就会变成乱码。
试过很多方法都无法解决,请教一下这是Win32::IEAutomation的问题吗?有可能解决吗?
(因不让发布URL,上面代码中的百度网址加了很多反斜线...)

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2015-11-02 16:36 |只看该作者
本帖最后由 104359176 于 2015-11-02 16:36 编辑

用 pack 对字符串进行转换,然后显示前用 unpack 恢复

论坛徽章:
0
3 [报告]
发表于 2015-11-02 16:55 |只看该作者
要确定源和目标编码,按照你的代码 use utf8,代码文件本身需要时UTF8编码的,里面的string常量才能是UTF8编码
其次确定目标编码,可以在HTML头文件里面加一个编码信息,确定IE用UTF8来显示就可以了

论坛徽章:
0
4 [报告]
发表于 2015-11-02 17:07 |只看该作者
回复 2# 104359176
多谢指导,请问具体到上面那段代码(其实就是打开IE,并在搜索框里输入一些文本),应该如何改写代码呢?


   

论坛徽章:
0
5 [报告]
发表于 2015-11-02 17:07 |只看该作者
回复 2# 104359176
多谢指导,请问具体到上面那段代码(其实就是打开IE,并在搜索框里输入一些文本),应该如何改写代码呢?


   

论坛徽章:
0
6 [报告]
发表于 2015-11-02 17:27 |只看该作者
回复 3# meilinxiaoxue

代码文件肯定是用utf8编写的,不然根本显示不了那些字符。
现在的问题是直接把这些字符粘贴到IE搜索框没有问题,显示都是正常的,而通过Win32::IEAutomation的SetValue将值设置到搜索框时,就会是乱码。
如图所示:


其中的“榛戣帗”就是utf8编码的“黑莓”按gbk解码的结果。

如果现将$string按gbk编码,则gbk字符集内的字符可以正常显示,但其他unicode字符,如韩语字符,还是不能正常显示:


就是无论$string如何编码,都会被按gbk解码...


   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
7 [报告]
发表于 2015-11-03 14:11 |只看该作者
浏览器对中文的支持大部分是GBK编码,包括IE和使用其作为内核进行重新包装的浏览器,只有谷歌等少数浏览器默认是 utf-8 编码。另外,大部分编辑器使用中文也是默认 gbk 编码。你可以尝试用支持 utf-8 的浏览器和编辑器测试,例如配置过的 Vim, Emacs, Sublime Text, Notepad++。Win32::IEAutomation 模块应当不会掺乎编码的事情,因为这不是中国人搞的。你多找找编辑器和浏览器的原因吧。

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

实在是找不到原因才发到论坛上来的,其实就是上面很简单的一段代码,运行后搜索框里就是乱码...


   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
9 [报告]
发表于 2015-11-03 14:49 |只看该作者
本帖最后由 104359176 于 2015-11-03 16:54 编辑

你可以用 Perl 内置的 Encode 模块先将 utf8-8 的字符转换成 GBK 编码的字符。
  1. use 5.010;
  2. use Encode;

  3. # 如果是 utf8 编码的字符串
  4. # 先用 utf8 解码,然后用 gbk 编码
  5. my $built_str = decode('utf8', $str);
  6. my $gbk_str = encode('gbk',built_str);
  7. say $gbk_str;
  8. 如果这个字符串显式乱码,那么你要处理的就已经是 gbk 编码了。
复制代码

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

这个已经试过了,先将字符串转换为gbk确实可行,gbk字符集内的字符可以正常显示,但我要传送的字符含有gbk字符集以外的字符,如韩语、德语中的一些特殊字符等等,这样就没办法了


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP