Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Encode::Guess:Guess_编码在不同的上下文中给出不同的结果_Perl_Character Encoding - Fatal编程技术网

Perl Encode::Guess:Guess_编码在不同的上下文中给出不同的结果

Perl Encode::Guess:Guess_编码在不同的上下文中给出不同的结果,perl,character-encoding,Perl,Character Encoding,我有一个打开文本文件并尝试确保其编码是UTF-8、ISO-8859-15或ASCII之一的子文件 我对它的问题是交互和非交互使用中的不同行为 当我与包含UTF-8行的文件交互运行时,$decoder是一个引用对象,其name为该行返回utf8 非交互方式(作为subversion提交钩子的一部分运行)guess\u encoding为utf8检查行返回一个标量字符串值utf8或iso-8859-15,并为其他两行返回iso-8859-15或utf8 为了我的生命,我无法找出行为上的差异是从哪

我有一个打开文本文件并尝试确保其编码是UTF-8、ISO-8859-15或ASCII之一的子文件

我对它的问题是交互和非交互使用中的不同行为

  • 当我与包含UTF-8行的文件交互运行时,
    $decoder
    是一个引用对象,其
    name
    为该行返回utf8

  • 非交互方式(作为subversion提交钩子的一部分运行)
    guess\u encoding
    utf8
    检查行返回一个标量字符串值
    utf8或iso-8859-15
    ,并为其他两行返回
    iso-8859-15或utf8

为了我的生命,我无法找出行为上的差异是从哪里来的。如果我强制
打开的编码
说出
名称;
}否则{
说“在第$line:[$\行]上错误识别编码“$decoder”;
my$z=解包('H*',$);
比如说$z;
$encoding=$decoder;
$retval=0;
}
最后一个if($retval==0);
}
近灰岩;
返回$retval;
}

无需猜测。对于UTF-8、ISO-8859-1和US-ASCII的特定选项,可以使用的是。是的

也就是说,我认为在OP中使用ISO-8859-1是对ISO-8859-15的一种拼写错误

fix_latin
使用的方法对ISO-8859-15和ISO-8859-1同样有效。这只是将
\u init\u byte\u map
替换为以下内容的问题:

sub _init_byte_map {
    foreach my $i (0x80..0xFF) {
        my $byte = chr($i);
        my $utf8 = Encode::from_to($byte, 'iso-8859-15', 'UTF-8');
        $byte_map->{$byte} = $utf8;
    }
}
或者,如果您愿意假设数据都是一种或另一种编码(而不是混合编码),也可以使用以下方法:

my $text;
if (!eval {
   $text = decode("UTF-8", $bytes, Encode::FB_CROAK|Encode::LEAVE_SRC);
   1  # No exception
}) {
   $text = decode("ISO-8859-15", $bytes);
}

请记住,US-ASCII是UTF-8和ISO-8859-15的适当子集,因此不需要专门处理。

我以为您应该输入Encode::猜测整个数据集(文件)以获得最准确的结果?对我来说,你似乎在试图分别猜测每一行的编码。即使对于UTF-8文件,有些行可能没有字节组合使它看起来像UTF-8,所以对于这些行,猜测也将考虑ASCII或ISO-88 5915。我也认为您应该使用“代码>从已知的知识视角,ISO-88 59-1=是。没有字节值或值序列与ISO-8859-1不兼容。等等,在一个地方你说的是
ISO-8859-1
,但在其他地方你说的是
-15
-1
是打字错误吗?大家好,谢谢大家的评论-对整个文件进行了修改,并给出了猜测编码()。然而,核心问题仍然存在:当以交互方式运行时,
$decoder
最终成为参考类型,当通过SVN钩子以非交互方式运行时,
$decoder
最终成为标量。我想了解为什么这应该有所不同?补充到答案中。嗨,说到底,我不想做
解码
,但如果这是检测编码最可靠的方法,我会用它来运行(预期的行为是在不可接受的编码上抛出错误,而不是在编码之间转换)。我主要关心的是在不同的上下文中(即交互与非交互)guess_编码的不同行为。
my $text;
if (!eval {
   $text = decode("UTF-8", $bytes, Encode::FB_CROAK|Encode::LEAVE_SRC);
   1  # No exception
}) {
   $text = decode("ISO-8859-15", $bytes);
}