7

ファイルを開いた場合 (そしてエンコーディングを直接指定した場合):

open(my $file,"<:encoding(UTF-16)","some.file") || die "error $!\n";
while(<$file>) {
    print "$_\n";
}
close($file);

ファイルの内容をうまく読み取ることができます。しかし、もしそうなら:

use Encode;

open(my $file,"some.file") || die "error $!\n";
while(<$file>) {
    print decode("UTF-16",$_);
}
close($file);

次のエラーが表示されます。

UTF-16:Unrecognised BOM d at F:/Perl/lib/Encode.pm line 174

どうすればそれを動作させることができdecodeますか?

編集:ここに最初の数バイトがあります:

FF FE 3C 00 68 00 74 00
4

3 に答える 3

12

単純に「UTF-16」を指定すると、Perl はバイト オーダー マーク (BOM) を探して、それを解析する方法を見つけます。BOM がないと、爆発します。その場合、リトル エンディアンの場合は「UTF-16LE」、ビッグ エンディアンの場合は「UTF-16BE」を指定して、どのバイト オーダーを Encode に指定する必要があります。

ただし、状況には別のことが起こっていますが、ファイルにあるデータを見ずに判断するのは困難です。両方のスニペットで同じエラーが発生します。BOM がなく、バイト オーダーを指定していない場合、Perl はどちらの方法でもエラーを出します。どの Perl を使用しており、どのプラットフォームを使用していますか? お使いのプラットフォームには、ファイルのネイティブ エンディアンがありますか? ドキュメントによると、私が見ている動作は正しいと思います。

また、不明なエンコーディング (Perl のデフォルトが何であれ) で行を単純に読み取って、それを に送信することはできませんdecode。マルチバイトシーケンスの途中で終わる可能性があります。Encode::FB_QUIETデコードできなかったバッファの部分を保存し、それを次のデータのチャンクに追加するために使用する必要があります。

open my($lefh), '<:raw', 'text-utf16.txt';

my $string;
while( $string .= <$lefh> ) {
    print decode("UTF-16LE", $string, Encode::FB_QUIET) 
    }
于 2010-05-22T15:30:24.337 に答える
5

UTF-16BE または UTF-16LE のいずれかを指定する必要があります。http://perldoc.perl.org/Encode/Unicode.html#Size%2c-Endianness%2c-and-BOMを参照してください。

于 2010-05-22T12:19:21.017 に答える
1

あなたがやろうとしていることは不可能です。

エンコーディングを指定せずにテキスト行を読み取っているため、改行文字 (デフォルト\x0a) を含むすべてのバイトが行を終了します。ただし、この改行文字は UTF-16 文字の途中にある可能性が非常に高く、その場合、次の行をデコードできません。データが UTF-16LE の場合、これは常に発生します。改行は\x0a \x00. UTF16-BE を使用している場合は、上位バイトにが含ま\x00 \x0aれる文字を取得するまで、運が良いかもしれません (改行は です) 。\x0a

したがって、そうしないでください。正しいエンコーディングでファイルを開きます。

于 2010-05-22T14:10:04.830 に答える