涉及使用特殊字符时打印宽字符

Wide character in print when involve using special characters

我想用点 . 字符拆分一个长句,只要点不包含在任何类型的括号中,如 ()、()、【】、〔〕等。左边至少应该有三个字。我使用以下代码。但它给出了 Wide character in print 错误。

my $a = "hi hello world. "
$a .= "【 hi hello world.  】";    
my @list = split /(?<!\.)(?<=(?:[\w'’]{1,30} ){2}[\w'’]{1,30})\. (?![^()〈〉【】()\[\]〔〕\{\}]*[\))\]〉】〕\}])/, $a;

预期的结果是 $a 拆分为: hi hello world【 hi hello world. 】

我在 macOS Big Sur 上使用 perl v5.31.3。

p.s。在项目中,我也在使用 XML::LibXML::Reader。我不确定是否允许添加 use utf8::all;

解码你的输入,编码你的输出


此警告是由于您尝试将字节以外的内容写入文件句柄[1]

您需要显式地或通过向文件句柄添加编码层来对输出进行编码。

use open ':std', ':encoding(UTF-8)';

如果您的源代码使用 UTF-8 编码,您需要使用 use utf8; 告诉 perl。否则,它假定源代码使用 ASCII 编码。[2]


如果您接受参数,这些也是需要解码的输入。您可以使用以下内容:

use Encode qw( decode_utf8 );

@ARGV = map { decode_utf8($_) } @ARGV;

  1. 为此,一个字节是介于 0 和 255 之间的值(含 0 和 255)。由于我们在谈论打印,所以我们在谈论具有这样一个值的字符(也就是字符串元素)。

  2. 虽然字符串和正则表达式文字是 8 位干净的。