我有一些有趣的结果试图辨别使用Encode::decode("utf8", $var)和之间的差异utf8::decode($var).我已经发现在变量上多次调用前者最终会导致错误"无法解码带有宽字符的字符串...",而后一种方法将很乐意运行多次,只需返回false.
我无法理解的是该length函数如何根据您用于解码的方法返回不同的结果.问题出现是因为我正在处理来自外部文件的"双重编码"utf8文本.为了演示这个问题,我在一行创建了一个文本文件"test.txt",其中包含以下Unicode字符:U + 00e8,U + 00ab,U + 0086,U + 000a.这些Unicode字符是Unicode字符U + 8acb的双重编码,以及换行符.该文件以UTF8编码为磁盘.然后我运行以下perl脚本:
#!/usr/bin/perl
use strict;
use warnings;
require "Encode.pm";
require "utf8.pm";
open FILE, "test.txt" or die $!;
my @lines = <FILE>;
my $test = $lines[0];
print "Length: " . (length $test) . "\n";
print "utf8 flag: " . utf8::is_utf8($test) . "\n";
my @unicode = (unpack('U*', $test));
print "Unicode:\n@unicode\n";
my @hex = (unpack('H*', $test));
print "Hex:\n@hex\n";
print "==============\n";
$test = Encode::decode("utf8", $test);
print "Length: …Run Code Online (Sandbox Code Playgroud) upper_bound状态的文档:
...它试图在有序范围内找到元素值[first,last] ... upper_bound返回[first,last]中最远的迭代器i,这样,对于[first,i)中的每个迭代器j,value <*j是假的.
但是,如果我们有一个vector<int> v包含数字1,2和3,upper_bound(v.begin(), v.end(), 5)则会返回调用v.end().但基于定义,v.end()不在范围内[v.begin, v.end()).没有这样的迭代器符合定义中的要求.这个定义是否只是懒惰而没有明确说明在这种情况下会发生什么?