Perl模块名中的UTF-8

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)中。不过,这很令人困惑。老实说,如

如何使用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)中。不过,这很令人困惑。

老实说,如果这是您计划发布的软件,我不推荐这种方法。即使您可以很好地使用它,但在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
块。确实如此,但是包也在编译时生效。当有两条语句都在编译时执行时,它们是按顺序执行的。另请参见:分发,分发对整个工具链的影响。另请参见:分发,分发对整个工具链的影响。