gpt4 book ai didi

perl - 关于路径名编码的问题

转载 作者:行者123 更新时间:2023-12-04 22:35:32 25 4
gpt4 key购买 nike

我做了什么来在这个路径名中获得如此奇怪的编码?
在我的文件管理器 (Dolphin) 中,路径名看起来不错。

#!/usr/local/bin/perl
use warnings;
use 5.014;
use utf8;
use open qw( :encoding(UTF-8) :std );
use File::Find;
use Devel::Peek;
use Encode qw(decode);

my $string;
find( sub { $string = $File::Find::name }, 'Delibes, Léo' );
$string =~ s|Delibes,\ ||;
$string =~ s|\..*\z||;
my ( $s1, $s2 ) = split m|/|, $string, 2;

say Dump $s1;
say Dump $s2;

# SV = PV(0x824b50) at 0x9346d8
# REFCNT = 1
# FLAGS = (PADMY,POK,pPOK,UTF8)
# PV = 0x93da30 "L\303\251o"\0 [UTF8 "L\x{e9}o"]
# CUR = 4
# LEN = 16

# SV = PV(0x7a7150) at 0x934c30
# REFCNT = 1
# FLAGS = (PADMY,POK,pPOK,UTF8)
# PV = 0x7781e0 "Lakm\303\203\302\251"\0 [UTF8 "Lakm\x{c3}\x{a9}"]
# CUR = 8
# LEN = 16

say $s1;
say $s2;

# Léo
# Lakmé

$s1 = decode( 'utf-8', $s1 );
$s2 = decode( 'utf-8', $s2 );

say $s1;
say $s2;

# L�o
# Lakmé

最佳答案

不幸的是,您的操作系统的路径名 API 是另一个“二进制接口(interface)”,您必须在其中使用 Encode::encodeEncode::decode以获得可预测的结果。

大多数操作系统将路径名视为八位字节序列(即字节)。该序列是否应被解释为 latin-1、UTF-8 或其他字符编码由应用程序决定。因此 readdir() 返回的值只是一个八位位组序列,File::Find不知道您希望路径名作为 Unicode 代码点。它形成 $File::Find::name通过简单地将目录路径(您提供的)与您的操作系统通过 readdir() 返回的值连接起来,这就是你如何得到与八位字节混合的代码点。

经验法则:每当将路径名传递给操作系统时,Encode::encode()它以确保它是一个八位字节序列。从操作系统获取路径名时,Encode::decode()它是您的应用程序想要的字符集。

您可以通过调用 find 使您的程序运行。这边走:

find( sub { ... }, Encode::encode('utf8', 'Delibes, Léo') );

然后调用 Encode::decode()当使用 $File::Find::name 的值时:
my $path = Encode::decode('utf8', $File::Find::name);

更清楚地说,这就是 $File::Find::name形成:
use Encode;

# This is a way to get $dir to be represented as a UTF-8 string

my $dir = 'L' .chr(233).'o'.chr(256);
chop $dir;

say "dir: ", d($dir); # length = 3

# This is what readdir() is returning:

my $leaf = encode('utf8', 'Lakem' . chr(233));

say "leaf: ", d($leaf); # length = 7

$File::Find::name = $dir . '/' . $leaf;

say "File::Find::name: ", d($File::Find::name);

sub d {
join(' ', map { sprintf("%02X", ord($_)) } split('', $_[0]))
}

关于perl - 关于路径名编码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7546341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com