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)代替。

由于编码名称不区分大小写,因此 UTF8utf8 相同(即非严格变量)。

更多细节: UTF-8 vs. utf8 vs. UTF8

更多阅读

有关 Perl 的 Unicode 处理的详细信息在以下来源中有更详细的描述:

来自 stackoverflow.com 的帖子(警告:可能不是最新的):

YouTube 视频: