1

2 つの非 ASCII 文字列を比較できませんが、両方の文字列がコンソール上では同じように表示されます。以下は私が試したことです。2 つの変数が等しくなるように、ここで欠落しているコードを教えてください。

if($lineContent[7] ne $name) {
  /*Control coming to here*/
  print "###### Values MIS-MATCHED\n";
} else {
  print "###### Values MATCHED\n";
}

$lineContent[7]CSVファイルからのものです

$name XMLファイルからのものです

Putty のコンソールがデフォルトの Characterset の場合

CSV Val: ENB69-åºå°å±
XML Val: ENB69-åºå°å±

Putty のコンソールが UTF-8 に設定されている場合

CSV Val: ENB69-基地局
XML Val: ENB69-基地局
4

3 に答える 3

3
#!/usr/bin/perl

use warnings;
use strict;
use Encode;

binmode STDOUT, ":encoding(utf8)";
open F1, "<:utf8", "$ARGV[0]" or die "$!";
open F2, "<", "$ARGV[0]" or die "$!";

my $a1 = <F1>;
chomp $a1;
my $a2 = <F2>;
chomp $a2;

if ($a1 eq $a2) {
    print "$a1=$a2 is true\n";
} else {
    print "$a1=$a2 is false\n";
}

my $b = decode("utf-8", $a2);
if ($a1 eq $b) {
    print "$a1=$b is true\n";
} else { 
    print "$a1=$b is false\n";
}

上記のテストプログラムを書きました。基地局という 1 行のテキスト ファイルを作成します。このテキスト ファイルを使用してプログラムを実行すると、false と true を取得できます。あなたのプログラムの内容はわかりませんが、csv ファイルはパーサーやエンコード/デコード手順なしでプレーン テキストとして読み取られると思いますが、xml ファイルは何らかのライブラリで解析する必要があるため、内部のエンコード メカニズムが異なります。エンコーディング表記の先行バイトを含む、2 つの文字列変数の場合。簡単に言えば、2 つの文字列変数のいずれかをエンコードまたはデコードして、それらが一致するかどうかを確認できます。

ところで、これが私の最初の回答です。少しでもお役に立てば幸いです ;-)

ダンプ結果から、それは明らかです。最初の変数は、内部構造に utf-8 エンコーディングで基地局を構成する 9 文字を格納します。2 番目の変数は、内部構造の 3 文字を表します。これらは同じバイト ストリームを持ち、バイト ストリーム ビューでは同じですが、文字ベースの比較では同じではありません。

デコード/エンコードを使用すると、問題を解決できます。

于 2012-09-05T08:35:32.323 に答える
1

あなたの入力:

"ENB13-\345\237\272\345\234\260\345\261\200"
"ENB13-\x{57fa}\x{5730}\x{5c40}"

ご覧のとおり、これらは明らかに同じではありません。具体的には、最初はもう一方のUTF-8エンコーディングです。常に入力をデコードします。常に出力をエンコードします。

use strict;
use warnings;

use utf8;                             # Source code is saved as UTF-8
use open ':std', ':encoding(UTF-8)';  # Terminal expects UTF-8

my $name = "ENB69-基地局";

while ($line = <STDIN>) {
   chomp;
   my @lineContent = split /\t/, $line;
   print($lineContent[7] eq $name ?1:0, "\n");  # 1
}
于 2012-09-05T15:31:25.747 に答える
1

個人的には、Unicode文字列を比較していることがわかっている場合は、もう少し注意が必要です。Unicode::Collateジョブのモジュールです。

もちろん、PerlでUnicodeを有効にするというトピックに関するtchristの今では有名なSOの投稿、https: //stackoverflow.com/a/6163129/468327も読む必要がありますがutf8::all、適切なUnicodeサポートをオンにするという素晴らしい仕事をしています。より良いユニコード処理がバージョンのPerlコアに追加された5.14ので、ここでもそれが必要であることに注意してください。

最後に、比較を行う簡単なスクリプトを示します。もちろん、必要に応じてファイルを読み取って変数を設定します。

#!/usr/bin/env perl

use v5.14;
use strict;
use warnings;

use utf8::all;
use Unicode::Collate;

my $collator = Unicode::Collate->new;

my $csv = "ENB69-基地局";
my $xml = "ENB69-基地局";

say $collator->eq($csv, $xml) ? "equal" : "unequal";
于 2012-09-05T13:11:56.680 に答える