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 角色 。