- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我希望打印的 Perl 脚本 found
执行时:
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use Encode;
use constant filename => 'Bärlauch';
open (my $out, '>', filename) or die;
close $out;
opendir(my $dir, '.') or die;
while (my $filename_read = readdir($dir)) {
# $filename_read = encode('utf8', $filename_read);
print "found\n" if $filename_read eq filename;
}
filename
的文件。 . (运行脚本后,我可以用
ls
验证文件是否存在,并且该文件不是用“funny”字符创建的。)
found
如果存在名称与刚刚创建的文件相同的文件。显然应该是这样。
LANG=en_US.UTF8
)
Barlauch
,它按预期工作并打印
found
.
$filename_read = encode('utf8', $filename_read);
不会改变行为。
最佳答案
改写的问题(按照我的解释)是:
Why doesn't
readdir
return back the newly created filename? (Here, represented by the variablefilename
which is set toBärlauch
).
filename
是一个 Perl 常量变量,所以这就是为什么它前面缺少
$
符号的原因。)
use utf8
程序开头的语句,
filename
将在编译时升级为 Unicode 字符串,因为它包含非 ASCII 字符。来自
utf8 的文档附注:
Enabling the utf8 pragma has the following effect: Bytes in the source text that are not in the ASCII character set will be treated as being part of a literal UTF-8 sequence. This includes most literals such as identifier names, string constants, and constant regular expression patterns.
The general principle is that Perl tries to keep its data as eight-bit bytes for as long as possible, but as soon as Unicodeness cannot be avoided, the data is transparently upgraded to Unicode.
...
Internally, Perl currently uses whatever the native eight-bit character set of the platform (for example Latin-1) is, defaulting to UTF-8, to encode Unicode strings.
filename
中的非 ASCII 字符是字母
ä
.如果您使用 ISO 8859-1 扩展 ASCII 编码 (Latin-1),则将其编码为字节值
0xE4
,看到这个
table在
ascii-code.com
.
ä
字符来自
filename
,它将仅包含 ASCII 字符,因此即使您使用
utf8
,它也不会在内部升级为 Unicode。语用。
filename
现在是带有内部
UTF-8
的 Unicode 字符串标志设置(有关
UTF-8
标志的更多信息,请参阅
utf8 编译指示)。注意字母
ä
以 UTF-8 编码为两个字节
0xC3 0xA4
.
filename
是一个 Unicode 字符串,它将被编码为 UTF-8。但是请注意,不必对
filename
进行编码第一个(
encode_utf8( filename )
)。见
Creating filenames with unicode characters想要查询更多的信息。因此,文件名以 UTF-8 编码字节的形式写入磁盘。
readdir
即使文件名包含以 UTF-8 编码的字节,也不返回 Unicode 字符串(设置了 UTF-8 标志的字符串)。它返回二进制或字节字符串,见
perlunitut有关字节字符串与字符 (Unicode) 字符串的讨论。
readdir
返回Unicode字符串?首先,根据
There are still many places where Unicode (in some encoding or another) could be given as arguments or received as results, or both in Perl, but it is not. (...)
The following are such interfaces. For all of these interfaces Perl currently (as of v5.16.0) simply assumes byte strings both as arguments and results. (...)
One reason that Perl does not attempt to resolve the role of Unicode in these situations is that the answers are highly dependent on the operating system and the file system(s). For example, whether filenames can be in Unicode and in exactly what kind of encoding, is not exactly a portable concept. (...)
- chdir, chmod, chown, chroot, exec, link, lstat, mkdir, rename, rmdir, - stat, symlink, truncate, unlink, utime, -X
- %ENV
- glob (aka the <*>)
- open, opendir, sysopen
- qx (aka the backtick operator), system
- readdir, readlink
readdir
返回字节字符串,因为通常不可能先验地知道文件名的编码。有关为什么这是不可能的背景信息,请参见例如:
$filename_read
使用变量
filename
:
print "found\n" if $filename_read eq filename;
$filename_read
之间的唯一区别和
filename
是
$filename_read
没有设置 UTF-8 标志(它不是 Perl 内部识别为“Unicode 字符串”的)。
eq
的结果运算符将取决于
$filename_read
中的字节是否为是否是纯 ASCII。根据
Encode 的文档模块:
Before the introduction of Unicode support in Perl, The
eq
operator just compared the strings represented by two scalars. Beginning with Perl 5.8,eq
compares two strings with simultaneous consideration of the UTF8 flag....
When you decode, the resulting UTF8 flag is on--unless you can unambiguously represent data.
eq
会考虑
UTF-8
标志自
$file_name_read
不包含纯 ASCII,因此它会
$filename_read
和
filename
其中相同且仅包含纯 ASCII 字节(并且
filename
仍然设置了 UTF-8 标志,
$filename_read
没有设置 UTF-8 标志),然后
eq
会认为两个字符串相等。参见
Encode 文档中的讨论有关此行为背景的更多信息。
readdir
返回的字节字符串来解决问题中的问题。转换为 Unicode 字符串(强制设置 UTF-8 标志):
$filename_read = Encode::decode_utf8( $filename_read );
ä
(带分音符的拉丁文小写字母 A)在
Bärlauch
.例如,
Encode::UTF8Mac
想要查询更多的信息。这意味着如果您在 Linux 机器上工作,例如克隆由 Mac 用户创建的 Git 存储库,您可以轻松地在 Linux 机器上获得 NFD 编码的文件名。所以 Linux 文件系统并不关心文件名的编码方式。它只是将其视为一个字节序列。因此,即使我的语言环境是
"en_US.UTF-8"
,我也可以轻松编写一个脚本来创建一个 ISO-Latin-1 编码的文件名。 .当前的语言环境设置只是应用程序的指导方针,但如果应用程序忽略了语言环境设置,则没有什么可以阻止它们这样做。
readdir
返回正在使用 NFC 或 NFD,您应该在解码后始终分解:
use Unicode::Normalize;
print "found\n" if NFD( $filename_read ) eq NFD( filename );
关于perl - readdir 以什么编码返回文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027051/
如果我的 Perl 程序使用 Perl 模块,它将如何确定在哪里可以找到包含模块代码的文件? 例如,如果程序包含: use MyModule1; # Example 1 us
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我正在自学 Perl,并且在我的 Windows 8 64 位系统上安装了 Strawberry。 Strawberry 命令行似乎工作正常,我在 C 驱动器上的 Strawberry 文件夹中创建了
我在 Perl 模块 IO::Socket::SSL 中发现了一个错误,我可能会修复它,但是,我担心测试修复。我从 Debian 下载了源码包(因为我打算为它制作一个 Debian 包或补丁)并查看了
我有一个 perl 文件,它使用了两个 perl 模块 A.pm 和 B.pm。 但是在 B.pm 中我需要调用 A.pm 的子程序。即使我在 A.pm 中使用并尝试使用它,我仍然遇到未定义的错误。
有没有办法在 Perl 运行时加载整个模块?我原以为我用 autouse 找到了一个很好的解决方案,但以下代码无法编译: package tryAutouse2; use autouse 'tryAu
过去,我编写过许多 perl 模块,以及不止一些独立的 perl 程序,但我之前从未发布过多文件 perl 程序。 我有一个几乎处于 beta 阶段的 perl 程序,它将被开源发布。它需要一些数据文
我有 1 个 perl 脚本,我们在其中编写了几个子例程。例子: # Try_1.pl main(); sub main{ --- --- check(); } check { -- --} 现在,
似乎 CPAN 上的一些(很多?)模块部分是使用 XS 在 C 中实现的,如果需要,可以回退到纯 perl 实现。虽然这很聪明,但它显然会损害性能,我想知道它是否会发生,以便我可以解决问题。 有没有一
我对 perl 很陌生。我希望我可以从 perl 安装一些软件包,我这样做是这样的: perl -MCPAN -e 'install VM::EC2' 我猜它由于依赖而失败,它显示: Result:
给定一个 Perl 包 Foo.pm,例如 package Foo; use strict; sub bar { # some code here } sub baz { # more
我有一个用 Perl 编写的测试生成器。它生成连接到模拟器的测试。这些测试本身是用 Perl 编写的,并通过其 API 连接到模拟器。我希望生成的代码是人类可读的,这意味着我希望它能够正确缩进和格式化
我正在学习 Perl,非常新的用户。我可以知道这些 Perl 代码之间有什么区别吗? #!/usr/bin/perl & #!/usr/bin/perl -w 最佳答案 那不是 perl 代码,它是
我不认为这是一个重复的问题。这专门针对 Perl 模块附带的脚本。 通常,在安装多个 Perl 版本时,您可以将 perl 可执行文件标记为版本号 (perl5.32),这样它们就可以在 /whate
我有一个在文件中使用 Blowfish 加密的程序和第二个 perl 程序,它提示输入用于将其解密为字符串的密码,我希望不必将解密的源代码写入硬盘驱动器,尽管将它放在内存中并不是真正的问题,因为运行程
有没有人为 Perl 中的惰性求值列表找到了一个好的解决方案?我尝试了很多方法来改变类似的东西 for my $item ( map { ... } @list ) { } 进入懒惰的评估——例如,通
我安装了多个版本的 Perl。 我已经指定了要使用的版本。但是为了验证,我想从 .pl 脚本本身输出 Perl 的版本。 这可能吗? 在 Perl 脚本中解析“perl --version”的输出似乎
人们还经常问“我怎样才能编译 Perl?”而他们真正想要的是创建一个可以在机器上运行的可执行文件,即使他们没有安装 Perl。 我知道有几种解决方案: perl2exe靛蓝之星 它是商业的。我从未尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!