2012-01-02 26 views
2

"עברית"のようなUTF8以外の文字を含む文字列があります 文字列をエンコードせずに文字列に書きたいとします。そうするために、私はバイナリとして書き込むためのファイルを開く:ユニコード文字列をperlのバイナリファイルに書き込む

open my $fh, ">>:raw", "/tmp/bla"; 
print $fh $mystring; 
close $fh; 

問題は、ファイルが破損していることです。私はバイナリビューでそれを開き、いくつかのバイトが壊れています。 何か間違っていますか?文字列をエンコードせずにファイルに書き込むことはできませんか?

+1

どのようにUTF8ではありませんか?正しく開かれていれば、内部的にUTF8になります。 –

答えて

1

あなたの評価は正しいです、間違っています。 You must encode text。例えば、:raw is for binary data。画像。あなたがUTF-8を見つけられない場合は、ISO-8859-8またはWindows-1255の代わりにエンコードを探しているかもしれません。

http://p3rl.org/UNIを読むと、Perlでのエンコードのトピックについて知ることができます。

+0

しかし、これはなぜ間違っていますか?私は誇りに思っていません。文字列をバイナリとして書きますか?私はそれをエンコードするのに問題があります。なぜなら、ファイルを読み込んで、perlではなくcで書かれたデコードしなければならないアプリケーションを制御していないからです。 – Shay

+0

@Shayだから、あなたのCプログラムはどのようなエンコーディングを期待していますか? – ikegami

+0

@daxim PDFファイルを保存するには、バイナリとして書く以外の方法はありません。たとえば、open(PDF、 "> $ filename"); binmode PDF; PDF $の内容を印刷し、ファイルをバイナリとして書き出します。その後、私はvimで開いてテキストとして読むことができますが、部品はかなり面白く見えます。エンコードを使ってそれを書き込もうとすると、ファイルが破損します。なぜPDFは例外ですか? –

0

エンコーディングは、バイトを使用したテキスト表現です。例えば、

ת === UTF-8 ==========> D7 AA 
ת === Windows-1255 ===> FA 
ת === iso-8859-8 =====> FA 

これは、ファイルがバイトのみを含めることができるので、それをコードせずに、ファイル内のテキストを保存することは不可能です。

$mystringにすでにバイト(エンコードされたテキスト)が含まれていても、「ユニコード文字列」があると言っても問題はありません。


私はあなたがあなたのファイルが

cat file 

または類似を使用して破損しているという結論に達して推定します。その場合、ロケールごとにファイルをエンコードする必要があります。

use open ':locale'; 
open my $fh, ">>", "file" or die $!; 
print $fh $mystring;