gpt4 book ai didi

perl - 使用 unicode 字符创建文件名

转载 作者:行者123 更新时间:2023-12-04 19:03:20 25 4
gpt4 key购买 nike

我正在寻找有关如何使用 Unicode 字符创建文件名的一些指南。考虑:

use open qw( :std :utf8 );
use strict;
use utf8;
use warnings;

use Data::Dump;
use Encode qw(encode);

my $utf8_file_name1 = encode('UTF-8', 'æ1', Encode::FB_CROAK | Encode::LEAVE_SRC);
my $utf8_file_name2 = 'æ2';
dd $utf8_file_name1;
dd $utf8_file_name2;
qx{touch $utf8_file_name1};
qx{touch $utf8_file_name2};
print (qx{ls æ*});

输出是:
"\xC3\xA61"
"\xE62"
æ1
æ2

为什么我用 UTF8 编码文件名并不重要? (无论哪种方式,文件名仍将变为有效的 UTF8。)

最佳答案

因为一个叫做“Unicode 错误”的错误。正在发生以下情况:

use Encode qw( encode_utf8 is_utf8 );

my $bytes = is_utf8($str) ? encode_utf8($str) : $str;
is_utf8检查标量使用两种字符串存储格式中的哪一种。这是一个您永远不必担心的内部实现细节,除了 Unicode 错误。

你的程序运行是因为 encode总是返回一个字符串,其中 is_utf8返回 false,并且 use utf8;总是返回一个字符串,其中 is_utf8如果字符串包含非 ASCII 字符,则返回 true。

如果你没有 encode正如您应该的那样,您有时会得到错误的结果。例如,如果您使用过 "\x{E6}2"而不是 'æ2' ,即使字符串具有相同的长度和相同的字符,您也会得到不同的文件名。
$ dir
total 0

$ perl -wE'
use utf8;
$fu="æ";
$fd="\x{E6}";
say sprintf "%vX", $_ for $fu, $fd;
say $fu eq $fd ? "eq" : "ne";
system("touch", $_) for "u".$fu, "d".$fd
'
E6
E6
eq

$ dir
total 0
-rw------- 1 ikegami ikegami 0 Jul 12 12:18 uæ
-rw------- 1 ikegami ikegami 0 Jul 12 12:18 d?

关于perl - 使用 unicode 字符创建文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31371257/

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