Unicode
文件名编码警告
值得一提的是,Filename Encoding 不仅是特定于平台的,而且还是特定于文件系统的。
假设(但通常通常是)只是因为你可以对给定的文件名进行编码和写入是完全安全的,当你稍后尝试打开相同的文件名进行读取时,它仍将被称为相同的东西。
例如,如果你写入不支持 unicode 的文件系统(如 FAT16
),则你的文件名可能会无声地转换为 ASCII 兼容的表单。
但是,它甚至不太安全的假设,一个文件,你可以创建,读取和写入由明确的命名通过其他调用查询时会叫同样的事情,比如,readdir
可能会为你的文件名不是你指定 open
返回不同的字节。
在某些系统(如 VAX)上,你甚至不能总是假设 readdir
将返回与 open
指定的文件名相同的文件名,就像 foo.bar
一样简单,因为操作系统可能会破坏文件扩展名。
此外,在 UNIX 上,操作系统允许的文件名有一组非常宽松的合法字符,仅排除/
和\0
,而在 Windows 上,文件名中禁止使用特定范围的字符并导致错误。
这里锻炼多注意,避免花哨的技巧与文件名,如果你有一个选择,始终测试,以确保你任何花哨的技巧做用是一致的。
**** 如果你正在编写旨在在你无法控制的平台上运行的代码,请务必倍加谨慎,例如,如果你正在编写专用于 CPAN
的代码,并假设至少 5%的用户群将被使用某些古老或破碎的技术,无论是通过选择,偶然还是通过他们无法控制的力量,这些都会合谋为他们制造虫子。
:encoding(utf8)
vs:utf8
由于 UTF-8 是用于在 Perl 中表示字符串的内部格式之一,因此通常可以跳过编码/解码步骤。如果你的数据已经是 UTF-8,你可以简单地使用:utf8
而不是:encoding(utf-8)
。:utf8
可以安全地用于输出流,而对于输入流,它可能是危险的,因为当你有无效的字节序列时会导致内部不一致。此外,使用:utf8
进行输入可能会导致安全漏洞,因此建议使用:encoding(utf-8)
。
更多细节:有什么区别:encoding 和:utf8
UTF-8 vs utf8 vs UTF8
从 Perl v5.8.7
开始,UTF-8
(带破折号)意味着 UTF-8 的严格和安全意识形式,而 utf8
意味着 UTF-8 的自由和松散形式。
例如,utf8
可用于 Unicode 中不存在的代码点,如 0xFFFFFFFF
。相应地,当使用 utf8
时,无效的 UTF-8 字节序列(如 \x{FE}\x{83}\x{BF}\x{BF}\x{BF}\x{BF}\x{BF}
)将解码为无效的 Unicode(但有效的 Perl)代码点(0xFFFFFFFF
),而 UTF-8
编码将不允许解码到有效 Unicode 范围之外的代码点,并且会给你一个取代字符(0xFFFD
)代替。
由于编码名称不区分大小写,因此 UTF8
与 utf8
相同(即非严格变量)。
更多细节: UTF-8 vs. utf8 vs. UTF8
更多阅读
有关 Perl 的 Unicode 处理的详细信息在以下来源中有更详细的描述:
- perlunicode
- perlunitut
- perluniintro
- perlunifaq
- perlunicook
- utf8 pragma
- unicode_strings 功能
- 打开 pragma
- PerlIO 的
- PerlIO 的编码::
- 开放功能
- 编码
- perlrun - 命令行开关
- 第 6 章,Perl 编程
来自 stackoverflow.com 的帖子(警告:可能不是最新的):
YouTube 视频:
- Ricardo Signes 在 YAPC NA 2016 上创作了一百万个 Squiggly 角色 。