3

私は、(おそらく) Latin-1 (ISO 8859-1) でエンコードされたファイルを受け取りました。これには、いくつかの変換とデータ マイニングが必要です。出力は UTF-8 であると想定されており、Perl でのエンコード変換について見つけられることはすべて試しましたが、どれも使用可能な出力を生成しませんでした。

そもそも何の役にも立たないことはわかってuse utf8;います。Encode私は有望に見えたパッケージを試しました:

open FILE, '<', $ARGV[0] or die $!;

my %tmp = ();
my $last_num = 0;

while (<FILE>) {
    $_ = decode('ISO-8859-1', encode('UTF-8', $_));

    chomp;
    next unless length;
    process($_);
}

binmode(STDOUT, ":utf8");考えられるあらゆる組み合わせで試してみましたopen FILE, '<:encoding(ISO-8859-1)', $ARGV[0] or die $!;。結果は、スクランブルされたウムラウト、または のようなエラー メッセージ\xC3 is not a valid UTF-8 character、さらには混合テキスト (一部は UTF-8、一部は Latin-1) でした。

私が望むのは、Latin-1 テキスト ファイルを読み込んで、コンソールで UTF-8 出力を生成する簡単な方法だけですprint。Perlでそれを行う簡単な方法はありますか?

4

3 に答える 3

6

Perl エンコーディングの概要とUnicode クックブックを参照してください。

  • piconvで最も簡単:

    $ piconv -f Latin1 -t UTF-8 < input.file > output.file
    
  • エンコーディング層で簡単:

    use autodie qw(:all);
    open my $input, '<:encoding(Latin1)', $ARGV[0];
    binmode STDOUT, ':encoding(UTF-8)';
    
  • 中程度、手動のデコーディング/エンコーディング:

    use Encode qw(decode encode);
    use autodie qw(:all);
    
    open my $input, '<:raw', $ARGV[0];
    binmode STDOUT, ':raw';
    while (my $raw = <$input>) {
        my $line = decode 'Latin1', $raw, Encode::FB_CROAK | Encode::LEAVE_SRC;
        my $result = process($line);
        print {STDOUT} encode 'UTF-8', $result, Encode::FB_CROAK | Encode::LEAVE_SRC;
    }
    
于 2012-08-03T09:31:48.580 に答える
5

多分として:

$_ = encode('utf-8', decode('ISO-8859-1', $_));

データはgb2312エンコードであるため、utf-8に変換できます。

#!/usr/bin/env perl

use Encode qw(encode decode);

while (<DATA>) {
    $_ = encode('utf-8', decode('gb2312', $_));
    print;
}

__DATA__
Â׶ذÂÔË»á
于 2012-08-03T08:50:29.703 に答える
3
$_ = decode('ISO-8859-1', encode('UTF-8', $_));

この行には 2 つの問題があります。まず、入力を UTF-8 にエンコードしてから、ISO-8859-1 からデコードします。これら 2 つの操作は間違った方法です。

第 2 に、ほぼ確実に、デコードとエンコードを同時に行いたくありません。Perl で文字エンコーディングを処理するためのゴールデン ルールは、次のプロセスに従うことです。

  1. 外界からデータを取得したらすぐにデコードします。これは、入力バイトストリームを受け取り、それを文字列の Perl の内部表現に変換します。
  2. 要件に従ってデータを処理します。
  3. 外部に送信する直前にデータをエンコードします。これは、Perl の文字列の内部表現を取得し、必要な出力エンコーディング用に正しくエンコードされたバイトストリームに変換します。
于 2012-08-03T10:39:46.807 に答える