免费注册 查看新帖 |

Chinaunix

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

[悬赏]rmb悬赏解决perl乱码问题 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2010-03-30 20:53 |只看该作者
唉,我多么想说问题已经解决了,但是用了js_escape出现的结果一模一样的,疯了我。现在唯一的办法就是不对中 ...
blackmuyu 发表于 2010-04-05 10:27


今天反复试验,总算有所发现,希望这个能彻底终结你的问题 {:3_189:}
你提到只要中文不放到uri_escape中就不会有问题,之前一直认为uri_escape对中文支持不行造成,后来才发现这其实是一个错误的方向。
我看到你在1楼帖子上有乱码截图,于是我想看看如何才能由原始的汉字得到那些乱码。 用iso 8859的编码去看,也是乱码,乱码的形式相似,但不相同。后来尝试perl的encode的时候,发现按照如下方式可以得到那些乱码:

  1. my $string = "我 你他的这那3";
  2. my $utf8_str = encode("utf8", $string);
  3. print "utf8 string : $utf8_str\n";
复制代码
perl字符本身就是按照utf8编码,如果再对其utf8编码一次,单字节字符不会变化,但象中文等双字节字符,肯定出现乱码了。
由此我想到你的乱码也是由于2次utf8编码产生的。第一次utf8编码是perl本身完成,这里没有任何错误,第二次utf8编码则是出现在ajax的传送过程中。ajax默认都是按照utf8的编码发送请求和返回response的。这个过程会对内容再一次进行utf8编码,于是再最终的接受到的页面中,中文都是2次utf8后的乱码了。

解决的办法是:
  对ajax传送的内容做一次utf8的decode,使2次utf8 encode变成 1次。
所以不妨试试:

  1.    print "Content-type: text/html\n\n";
  2.         print decode("utf8",$mainajaxcontent);
  3. ...  ...
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-03-30 20:56 |只看该作者
本帖最后由 blackmuyu 于 2010-03-30 20:58 编辑

对了,还有个locale的显示,系统是centOS

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2010-03-30 21:08 |只看该作者
兄弟,你知道你为啥乱码麽。
因为你缺乏做技术人员的一种气质。
什么气质?发个帖子都不发文字发图片。
这是等着我们 OCR 完了帮你调试呢?

论坛徽章:
0
4 [报告]
发表于 2010-03-30 21:49 |只看该作者
如果都用UTF-8的话,应该不会出现乱码。几个地方注意下:
1. 网页自身用UTF8保存。
2. HTML的content-type设置。
3. web服务器的character设置。

论坛徽章:
0
5 [报告]
发表于 2010-03-30 22:14 |只看该作者
谢谢两位版主的热心指正和批评,呵呵,没放上附件是我的不是,这就补上。
如果两位版主有时间、有兴趣的话,我可以把远程桌面的密码给你们,麻烦帮我看看。这个反正是我自己租用的服务器。
乱码.rar (18.54 KB, 下载次数: 82)

论坛徽章:
0
6 [报告]
发表于 2010-03-31 10:35 |只看该作者
我想可能是uri_escape造成的乱码,不妨用uri_escape_utf8() 试试。
我在http://search.cpan.org/~gaas/URI-1.53/URI/Escape.pm  看到如下说明

  1. uri_escape( $string, $unsafe )

  2.     Replaces each unsafe character in the $string with the corresponding escape sequence and returns the result. The $string argument should be a string of bytes. The uri_escape() function will croak if given a characters with code above 255. Use uri_escape_utf8() if you know you have such chars or/and want chars in the 128 .. 255 range treated as UTF-8.
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-03-31 13:29 |只看该作者
本帖最后由 blackmuyu 于 2010-03-31 13:30 编辑
我想可能是uri_escape造成的乱码,不妨用uri_escape_utf8() 试试。
我在  看到如下说明
climby 发表于 2010-03-31 10:35



  哇咔咔,谢谢楼上的兄台,虽然用  uri_escape_utf8() 没有解决乱码,但是问题确实是uri_escape造成的。我的解决办法是把所有html的标签用uri_escape解决,然后中文部分不用uri_escape。比如$a1=uri_escape("<tr>"),$a2=uri_escape("</tr>"),然后输出用 print "$a1我$a2",这样就行。

climby兄,麻烦论坛邮箱里把你的银行账户发给我下,茶钱,hoho!对了,除了这个笨方法,还有哪位兄台有高招吗?

论坛徽章:
0
8 [报告]
发表于 2010-03-31 15:45 |只看该作者
{:3_189:} 据我所知uri_escape是专门针对url来做escape的,保证该url中的特殊字符被正确转义,这样url才能确保对server端有效。 你在代码中对很多内容都使用了uri_escape, 不知道是否是要将此部分内容传回服务器分析,如果是的的话,使用uri_escape()完全没错, 而且需要对所有内容进行uri_escape.
对于你最后页面的输出,就是

  1.    print "Content-type: text/html\n\n";
  2.         print $mainajaxcontent;
  3. ...  ...
复制代码
为确保在页面正确输出, 你完全可以用uri_unescape()一下再输出哦, 这样英文还是那个英文,中文还是那个中文的 {:3_193:}

论坛徽章:
0
9 [报告]
发表于 2010-04-02 09:08 |只看该作者
我用了uri_unescape(),结果什么都不出来。我分析应该是uri_escape()把特殊符号escape成%xx后传给浏览器,如果用了uri_unescape(),那些空格,/等特殊字符传给浏览器,无法识别。

论坛徽章:
0
10 [报告]
发表于 2010-04-02 11:41 |只看该作者
我的意思是别的地方还是使用uri_escape().

但当你输出页面时,就这行

  1. print "Content-type: text/html\n\n";

  2.         print $mainajaxcontent;


复制代码
修改成

  1. print "Content-type: text/html\n\n";

  2.         print  uri_unescape( $mainajaxcontent);

复制代码
这样不影响别的地方,只是需要输出时unescape一下的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP