我有这个代码:
use strict; use warnings; use utf8; use HTML::Entities; use feature 'say'; binmode STDOUT, ':encoding(utf-8)'; my $t1 = "Česká Spořitelna - Q3 2014"; my $t2 = "Česká Spořitelna - Q3 2014"; say decode_entities($t1); say decode_entities($t2);
在我的开发机器上执行时输出:
?eská Spo?itelna - Q3 2014 ?eská Spo?itelna - Q3 2014
当在UAT机器上执行(Aser Acceptance Test)时,输出:
Äeská SpoÅitelna - Q3 2014 Äeská SpoÅitelna - Q3 2014
现在,在两台机器上,当我运行时,perl -v
我们有这是为x86_64-linux-thread-multi-ld构建的perl 5,版本16,subversion 3(v5.16.3)
并且HTML::Entities
两台机器上的版本相同:
Installed: 3.69 CPAN: 3.69 up to date
我的开发机器运行CentOS release 5.8 (Final)
,UAT机器运行Red Hat Enterprise Linux Server release 5.8 (Tikanga)
编辑(关于locale
命令的输出)它的输出在两台机器上是相同的:
LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
更新:
我在facebook 上的perl开发者小组发布了这个问题的链接,并从那里得到了一些非常有用的想法:比较两个系统上的输出字节.如果它们相同,那就是显示问题.他们是.现在,有多种方法可以做到:
1)
say join ':', map { ord } split //, decode_entities($t1); say join ':', map { ord } split //, decode_entities($t2);
它显示268:101:115:107:225:32:83:112:111:345:105:116:101:108:110:97:32:45:32:81:51:32:50:48:49:52
在两个系统上,因此,字节是相同的
2)打印$t1
并$t2
输出到每个系统上的文件,然后hexdump -C
针对这些文件运行并比较输出.此方法还显示文件的内容相同
结论
这是一个显示问题 - 控制台(putty)没有正确显示字符.当我们在数据库中添加这些字符时,我们遇到了这个问题,我认为我设法用上面的代码隔离它.你的答案(以及fb中的一些)帮助我找到了decode_entities()
预期的工作,我们的问题在于其他地方(很可能在mysql表charset或mysql连接).