内容

名称

encoding::warnings - 警告隐式编码转换

版本

本文档描述了 2016 年 6 月 20 日发布的 encoding::warnings 版本 0.13。

注意

从 Perl 5.26.0 开始,此模块不再起作用。用于实现此模块的内部 Perl 功能已被移除。近年来,Perl 核心做了很多工作来消除升级字符串和降级字符串处理之间的差异。此外,导致许多问题的 encoding 编译指示不再受支持。因此,此模块产生的警告不再必要。

因此,如果您在 Perl 5.26.0 上加载此模块,您将收到一条警告,提示该模块不再受支持;此后,该模块将不再执行任何操作。

概要

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;

描述

问题的概述

默认情况下,Perl 的 unicode 模型存在一个基本的不对称性:从字节字符串到 unicode 字符串的隐式升级假设它们是用 ISO 8859-1 (Latin-1) 编码的,但 unicode 字符串是用 UTF-8 编码降级的。这是因为 Unicode 中的前 256 个码点恰好与 Latin-1 相同。

但是,如果您碰巧将 unicode 字符串与非 Latin-1 数据(即 UTF-8 或其他编码的字节字符串)混合使用,这种静默升级很容易导致问题。错误不会在组合字符串写入输出之前显现,到那时,就无法看到静默升级发生在哪里。

检测问题

此模块简化了诊断此类问题的过程。只需将此行放在主程序的顶部

use encoding::warnings;

之后,高位字节的隐式升级将引发警告。例如:字节隐式升级为宽字符,编码为 iso-8859-1,位于 - 第 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 by Audrey Tang <[email protected]>。

本程序是自由软件;您可以根据与 Perl 本身相同的条款重新发布和/或修改它。

参见 https://perldotcom.perl5.cn/perl/misc/Artistic.html