相同的代码,不同机器上有关UTF8字符的不同结果

 文布得 发布于 2022-12-25 15:04

我有这个代码:

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连接).

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有