Perl Text :: Unaccent:无效或不完整的多字节或宽字符

时间:2015-08-19 17:34:38

标签: perl character-encoding

当我尝试使用Perl的private void receiptView_CellClick(object sender, DataGridViewCellEventArgs e) { this.DoStuff(); } private void receiptView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { this.DoStuff(); } private void DoStuff() { if (!_selectionChanged) { //do other stuff here receiptView.ClearSelection(); _selectionChanged = true; } else { //do other stuff here _selectionChanged = false; } } 模块将带有某些变音符号的字符串转换为非重音符号时,我收到错误Invalid or incomplete multibyte or wide character。该字符串取自我正在处理的文件。该字符串为Text::Unaccent,我试图将其转换为CÚIL BEAG

CUIL BEAG

use Text::Unaccent; ... print unac_string('utf-8', $my_string) 实用程序告诉我:

chardet

...所以我尝试了charset以及my_file.dat: windows-1252 (confidence: 0.50) utf-16unicode ...... 但是,如果我在命令行上运行它,例如:

ISO_8859-2

......它运作正常,并将信件正确地转换为普通的“U'

如果我将字符串perl -e ' use strict; use warnings; use Text::Unaccent; my $s = "CÚIL BEAG"; $s = unac_string("utf-8",$s); print "$s\n"; ' 硬编码到我的脚本中,我会得到相同的错误并且没有转换。

当我在尝试转换字符串之前打印字符串时,我得到CÚIL BEAG 转换尝试后字符串未定义。

我尝试过跑步:

C�IL BEAG

提供的文件路径是我的dat文件,其中只有一行,包含字符串#!/usr/bin/perl use utf8; use strict; use warnings; use Encode qw/ encode_utf8 /; use Text::Unaccent 'unac_string'; open my $fh, '<:encoding(cp1252)', $ARGV[0] or die "Unable to open file: " . $!; # also tried '<:encoding(ISO-8859-1)' while ( <$fh> ) { print $_; my $unaccented = unac_string('UTF-8', encode_utf8($_)); print $unaccented . "\n"; } 。输出是:

CÚIL BEAG

2 个答案:

答案 0 :(得分:2)

您需要use utf8说明脚本的内容是使用UTF-8编码的。然后它将使用硬编码字符串正常工作

use utf8;
use strict;
use warnings;
use 5.010;

use Encode 'encode_utf8';
use Text::Unaccent 'unac_string';

binmode STDOUT, ':encoding(CP-1252)';

my $s = 'CÚIL BEAG';

my $unaccented = unac_string('UTF-8', encode_utf8($s));
say $unaccented;

输出

CUIL BEAG

您没有显示如何从文件中获取字符串,但需要正确地重新编码为Perl内部格式。您可能会发现添加

use open qw/ :std IN :encoding(ISO-8859-1) /;
程序开头的

会有所帮助,或者您可以在使用

打开文件时指定编码
open my $fh, '<:encoding(CP-1252)', 'myfile.txt' or die $!;

但我不知道你应该使用什么编码而不看一些数据


一旦你知道编码,就可以直接从文件中读取,我担心我无法理解你可能做错了什么

此程序将打印整个ISO-8859-1编码的文件,并删除重音符号。您应该将它与您自己的代码进行比较

use utf8;
use strict;
use warnings;
use 5.010;

use Encode 'encode_utf8';
use Text::Unaccent 'unac_string';

binmode STDOUT, ':encoding(CP-1252)';

open my $fh, '<:encoding(CP-1252)', 'myfile.txt' or die $!;

while ( <$fh> ) {
    my $unaccented = unac_string('UTF-8', encode_utf8($_));
    print $unaccented;
}

答案 1 :(得分:2)

use utf8;                              # Source code is encoded using UTF-8.
use open ':std', ':encoding(UTF-8)';   # Terminal uses UTF-8.

use Encode         qw( encode_utf8 );
use Text::Unaccent qw( unac_string );

open(my $fh, '<:encoding(cp1252)', $qfn)
   or die("Can't open file \"$qfn\": $!\n");

while (my $uni = <$fh>) {
   my $unaccented = unac_string('UTF-8', encode_utf8($uni));
   print("$uni => $unaccented\n");
}
  • 嗯,您的文件实际上完全是ASCII,因此use utf8;实际上并没有做任何事情。

  • 第二行告诉Perl使用UTF-8解码/编码发送到/来自STDIN / STDOUT / STDERR /文件的IO,因为这是您的终端所期望的。

  • 但是,您的特定文件是使用Windows-1252(即cp1252)编码的,因此我们将使用:encoding图层覆盖之前的编译指示。

  • unac_string需要编码字符串,因此我们会使用UTF-8对其进行重新编码。