/ /バイト順がわからない場合にPerlでUTF-16データをデコードするにはどうすればよいですか? -perl、decode、utf-16

バイトオーダーがわからないときに、どのようにしてPerlでUTF-16データをデコードできますか? - perl、decode、utf-16

ファイルを開いた場合(およびエンコードを直接指定した場合):

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

回答:

回答№1の場合は12

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

他に何かが起こっているしかし、「ファイルにあるデータを見ずに見分けるのは困難です。両方のスニペットで同じエラーが発生します。BOMがなく、バイト順序を指定しないと、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)
}

回答№2のための5

UTF-16BEまたはUTF-16LEを指定する必要があります。見る http://perldoc.perl.org/Encode/Unicode.html#Size%2c-Endianness%2c-and-BOM


回答№3の場合は1

あなたが不可能なことをしようとしている。

あなた」を読んでいます エンコードを指定せずにテキストを記述するため、改行文字を含むすべてのバイト(デフォルト x0a)行を終了します。 しかし、この改行文字はUTF-16文字の途中にある可能性が高く、その場合、次の行はデコードできません。 データがUTF-16LEの場合、これは常に発生します–改行は x0a x00。 UTF16-BEをお持ちの場合、ラッキーになるかもしれません(改行は x00 x0a)、あなたがキャラクターを得るまで x0a 上位バイト。

だから、それをしないで、正しいエンコーディングでファイルを開いてください。