【问题标题】:CWD unicode supportCWD Unicode 支持
【发布时间】:2012-03-02 08:52:40
【问题描述】:

关于 Unicode 的 CWD 模块是否不是最新的,或者 abs_path 是否应该仅在写入操作系统时使用?

#!/usr/bin/env perl
use warnings;
use 5.012;
use utf8;
binmode STDOUT, ':encoding(utf-8)';
use Cwd qw(abs_path);
use File::Spec::Functions qw(rel2abs);

chdir '/tmp';

my $file = "Hello \x{263a}";

open my $fh, '>', $file or die $!;
say $fh 'test';
close $fh;

say abs_path $file;
say rel2abs $file;

输出:

# /tmp/Hello âº
# /tmp/Hello ☺

【问题讨论】:

    标签: perl unicode path operating-system cwd


    【解决方案1】:

    Cwd 模块在内部使用char * 类型,因此根本不处理编码。通常,文件系统并不关心您为文件名使用的字符或编码,只要您转义任何特殊字符(例如“/”)

    如果你想告诉 Perl 文件路径是 UTF-8,你可以对其进行编码:

    use Encode qw(decode_utf8);
    
    ...
    say decode_utf8(abs_path $file);
    

    【讨论】:

    • @sid_com 你总是希望给编码/解码函数一个额外的参数,通常是1,这样你就可以检测编码错误。这里是decode_utf8(abs_path($file), 1)。您可以从Encode 模块导入其他更高级的值以传递到那里; 1 相当于FB_CROAK,它会在错误时引发异常,而不是对你隐藏它。
    • 应该是decode_utf8(abs_path encode_utf8($file));,这是假设你的文件名使用UTF-8。
    【解决方案2】:

    Perl 让您来解码它返回的路径并编码您提供的路径。 (糟糕!)

    【讨论】:

    • 我同意这是次优且混乱的,但是您有更好的主意吗?这到底是如何自动、正确且可移植地完成的?
    • @tchrist,我不认为文件名无法读取或显示。因此,这是可以做到的。这样做可能很难,这更有理由在语言中完成一次工作,而不是让每个程序员都想出一个不可避免的错误解决方案。
    • 不是不仅依赖于操作系统,还依赖于每个挂载的文件系统吗?如果是 8 位编码,谁能说应该如何处理?用户的区域设置甚至可以改变这一点。我真的不知道该怎么做。自动编码/解码 UTF-8 似乎不安全,因为它并不总是这样。
    • @tchrist,因此您的论点是:由于某些系统已损坏,无法确定文件名的编码,因此最好让用户处理。我看不出结论是如何从前提得出的。是什么让您认为用户更擅长处理它?
    • @Håkon Hægland。假设 utf-8 系统:(
    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2011-04-15
    • 2011-10-16
    • 2014-12-25
    • 2013-05-29
    • 2010-09-07
    相关资源
    最近更新 更多