当我尝试使用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-16
,unicode
......
但是,如果我在命令行上运行它,例如:
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
答案 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对其进行重新编码。