Perl模块名中的UTF-8
如何使用UTF-8的名称和文件名编写Perl模块?我目前的尝试结果是“无法在@INC中找到täst.pm”,但该文件确实存在。我在Windows上,还没有在Linux上尝试过Perl模块名中的UTF-8,perl,utf-8,perl-module,Perl,Utf 8,Perl Module,如何使用UTF-8的名称和文件名编写Perl模块?我目前的尝试结果是“无法在@INC中找到täst.pm”,但该文件确实存在。我在Windows上,还没有在Linux上尝试过 test.pl: use strict; use warnings; use utf8; use Täst; Täst.pm: package Täst; use utf8; 更新:我目前的工作是使用Tast(ASCII)并将包Täst(Unicode)放在Tast.pm(ASCII)中。不过,这很令人困惑。老实说,如
test.pl
:
use strict;
use warnings;
use utf8;
use Täst;
Täst.pm
:
package Täst;
use utf8;
更新:我目前的工作是使用Tast(ASCII)并将
包Täst
(Unicode)放在Tast.pm
(ASCII)中。不过,这很令人困惑。老实说,如果这是您计划发布的软件,我不推荐这种方法。即使您可以很好地使用它,但在UTF-8配置不正确的机器上,以及/或文件名可能不包含UTF-8字符等,它可能会有点脆弱。老实说,如果这是您计划发布的软件,我不推荐这种方法。即使您可以很好地使用它,但在UTF-8配置不正确的机器上,和/或文件名可能不包含UTF-8字符等,它也可能有点脆弱。不幸的是,Perl、Windows和Unicode文件名目前确实不在一起。我的建议是省去很多麻烦,并坚持使用普通ASCII作为模块名。这提到了一些问题。不幸的是,Perl、Windows和Unicode文件名目前确实不在一起。我的建议是省去很多麻烦,并坚持使用普通ASCII作为模块名。这提到了一些问题。需要在包Täst
之前显示使用utf8
,以便正确解释后者。在我的Mac电脑上:
test.pl:
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Tëst;
# 'use utf8' only indicates the code's encoding, but we also want stdout to be utf8
use encoding "utf8";
Tëst::hëllö();
下午三时:
use utf8;
package Tëst;
sub Tëst::hëllö() {
print "Hëllö, wörld!\n";
}
1;
输出:
Macintosh:Desktop sherm$ ./test.pl
Hëllö, wörld!
正如我所说,我在我的Mac上运行了这个。正如cjm上面所说,您的里程数在Windows上可能会有所不同。需要在
程序包Täst
之前显示使用utf8
,以便正确解释后者。在我的Mac电脑上:
test.pl:
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Tëst;
# 'use utf8' only indicates the code's encoding, but we also want stdout to be utf8
use encoding "utf8";
Tëst::hëllö();
下午三时:
use utf8;
package Tëst;
sub Tëst::hëllö() {
print "Hëllö, wörld!\n";
}
1;
输出:
Macintosh:Desktop sherm$ ./test.pl
Hëllö, wörld!
正如我所说,我在我的Mac上运行了这个。正如cjm上面所说,您的里程数在Windows上可能会有所不同。Unicode支持通常在边界处失败。包和子例程名称需要清晰地映射到文件名上,这在某些操作系统上是有问题的。操作系统不仅必须创建您期望的文件名,而且您还必须能够在以后以相同的名称找到它
我们在中讨论了一些文件名问题,但在中我还总结了更多内容。Jeff Atwood在他的文章中提到了这一点。Unicode支持经常在边界处失败。包和子例程名称需要清晰地映射到文件名上,这在某些操作系统上是有问题的。操作系统不仅必须创建您期望的文件名,而且您还必须能够在以后以相同的名称找到它
我们在中讨论了一些文件名问题,但在中我还总结了更多内容。杰夫·阿特伍德(Jeff Atwood)在他的文章中提到了这一点。你也确信你的编辑做了UTF-8,并且你在cmd窗口中做了chcp 65001?你真的很勇敢!:)您的解决方法适用于纯OOP模块,但这确实意味着Täst将无法导出任何非OO函数-
use Tast
将查找Tast::import()
,并且由于包名为Täst,因此找不到它。当Windows&Mac用户在他们的脚本中使用cgi
时,我也看到过同样的情况-perl会找到.pm,因为文件系统不区分大小写,但它找不到名为cgi的包,因此无法从中导入任何符号。而且您还可以确定,您的编辑器使用UTF-8,你在cmd窗口中完成了chcp 65001?你真的很勇敢!:)您的解决方法适用于纯OOP模块,但这确实意味着Täst将无法导出任何非OO函数-use Tast
将查找Tast::import()
,并且由于包名为Täst,因此找不到它。当Windows&Mac用户在他们的脚本中使用cgi
时,我也看到过同样的情况——perl找到.pm,因为文件系统不区分大小写,但找不到名为cgi的包,因此无法从中导入任何符号。我可以接受一个妨碍可移植性的解决方案。我可以接受一个妨碍可移植性的解决方案。这对我来说不起作用,但很高兴知道在某些操作系统下这是可能的。我想这基本上就是它能解决的问题-Perl可以解决,但它依赖于底层操作系统和文件系统也能够.OK。顺便说一句,感谢您注意到使用utf8
的顺序;我认为pragma总是被移动到BEGIN
块。确实如此,但是包也在编译时生效。当有两条语句都在编译时执行时,它们是按顺序执行的。这对我来说不起作用,但很高兴知道在某些操作系统下这是可能的。我认为这基本上就是问题所在-Perl可以处理,但它依赖于底层操作系统和文件系统也能够处理。OK。顺便说一句,感谢您注意到使用utf8
的顺序;我认为pragma总是被移动到BEGIN
块。确实如此,但是包也在编译时生效。当有两条语句都在编译时执行时,它们是按顺序执行的。另请参见:分发,分发对整个工具链的影响。另请参见:分发,分发对整个工具链的影响。