內容

名稱

encoding::warnings - 警告隱式編碼轉換

版本

此文件說明 encoding::warnings 的版本 0.13,於 2016 年 6 月 20 日發布。

注意事項

從 Perl 5.26.0 開始,此模組已無作用。用於實作此模組的 Perl 內部功能已移除。近年來,Perl 核心已投入大量工作,以消除升級字串與降級字串處理上的差異。此外,造成許多問題的 encoding pragma 已不再受支援。因此,此模組產生的警告已不再必要。

因此,如果您在 Perl 5.26.0 上載入此模組,您將會收到一則警告,表示此模組已不再受支援;之後,此模組將不再執行任何動作。

SYNOPSIS

use encoding::warnings; # or 'FATAL' to raise fatal exceptions

utf8::encode($a = chr(20000));  # a byte-string (raw bytes)
$b = chr(20000);                # a unicode-string (wide characters)

# "Bytes implicitly upgraded into wide characters as iso-8859-1"
$c = $a . $b;

DESCRIPTION

問題概觀

預設情況下,Perl 的 unicode 模型存在一個基本的非對稱性:從位元組字串到 unicode 字串的隱式升級假設它們編碼為 ISO 8859-1 (Latin-1),但 unicode 字串會以 UTF-8 編碼降級。這是因為 Unicode 中的前 256 個碼點恰好與 Latin-1 相同。

但是,如果您將 unicode 字串與非 Latin1 資料(即以 UTF-8 或其他編碼編碼的位元組字串)混合,這種隱式升級很容易造成問題。錯誤不會在合併字串寫入輸出之前顯現,屆時將無法看出隱式升級發生在哪裡。

偵測問題

此模組簡化了診斷此類問題的流程。只要在您的主程式最上方加上這行

use encoding::warnings;

之後,高位元位元組的隱式升級將會引發警告。例如:Bytes implicitly upgraded into wide characters as iso-8859-1 at - line 7

但是,純粹由 ASCII 碼點 (0x00..0x7F) 組成的字串不會觸發此警告。

您也可以透過將此模組匯入為

use encoding::warnings 'FATAL';

解決問題

大多數情況下,此警告會在位元組字串與 unicode 字串串接時發生。有許多方法可以解決此問題

注意事項

對於 Perl 5.9.4 或更新版本,此模組的效果是詞彙的。

對於 5.9.4 之前的 Perl 版本,此模組會影響整個指令碼,而不是其詞彙區塊內部。

另請參閱

perlunicodeperluniintro

openutf8encodingEncode

作者

Audrey Tang

版權

版權所有 2004、2005、2006、2007 Audrey Tang <cpan@audreyt.org>。

此程式是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。

請參閱 http://www.perl.com/perl/misc/Artistic.html