1

Windows で作成した Perl プログラムがあります。それでは始まります:

$unused_header = <STDIN>;
my @header_fields = split('\|\^\|', $unused_header, -1);

次の非常に大きなファイルで構成される入力を分割する必要があります。

The|^|Quick|^|Brown|^|Fox|!|

の中へ:

{The, Quick, Brown, Fox|!|}

注: この行はヘッダーのみを実行します。繰り返しのデータ行を実行するのと同じような別の行があります。

Windowsではうまくいきましたが、Linuxでは失敗します。ただし、Perl 内で同じ内容の文字列を定義し、それに対して分割を実行すると、正常に動作します。

UTF-16エンコーディングの扱いの問題だと思うのですが、どうしたらいいのかわかりません。STDINにパイプされているUTF-16をperlに理解させる方法を知っている人はいますか?

http://www.haboogo.com/matching_patterns/2009/01/utf-16-processing-issue-in-perl.htmlを見つけましたが、どうすればよいかわかりません。

4

3 に答える 3

5

STDIN が UTF-16 の場合、次のいずれかを使用します。

binmode(STDIN, ':encoding(UTF-16le)');   # Byte order used by Windows.
binmode(STDIN, ':encoding(UTF-16be)');   # The other byte order.
binmode(STDIN, ':encoding(UTF-16)');     # Use BOM to determine byte order.
于 2012-09-24T22:40:26.883 に答える
3

トムはperlとunicodeに関して長い答えを書いています。UTF-8を適切かつ完全にサポートするためのボイラープレートコードが含まれていますが、必要に応じてUTF-16に置き換えることができます。

于 2012-09-24T22:47:37.667 に答える
0

Windows PerlもUnix Perlも、あなたが指示しない限り、これらのエンコーディングでデータを読み取ろうとしないため、UTF-xxエンコーディングの問題ではないかと思います。

Unix スクリプトが Windows スクリプトとまったく同じファイルを読み取っているが、動作が異なる場合は、行末の問題である可能性があります。ほとんどの Unix-y システムのdos2unixコマンドは、ファイルの行末を変更できます。または、Perl スクリプトで自分で行末を取り除くことができます。

$unused_header = <STDIN>;
$unused_header =~ s/\r?\n$//;   # chop \r\n (Windows) or \n (Unix)
于 2012-09-24T23:05:48.860 に答える