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 視訊: