2012-01-02 94 views
2

我有一個字符串包含不是UTF8的charactures,比如「עברית」 我想將字符串寫入文件而不編碼字符串。爲此,我打開文件以寫入二進制文件:在Unicode編寫unicode字符串到二進制文件

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

問題是該文件已損壞。我在二進制視圖中打開它,並且一些字節已損壞。 我做錯了什麼?將字符串寫入文件而不編碼它是不可能的?

+1

它是不是UTF8?如果它被正確打開,它將在UTF8內部。 – 2012-01-02 17:59:14

回答

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 2012-01-02 16:25:34

+0

@Shay,那麼你的C程序期望什麼編碼? – ikegami 2012-01-02 21:05:47

+0

@daxim爲了保存一個PDF文件,除了把它寫成二進制文件外,我沒有發現任何其他的工作。例如,打開(PDF,「> $ filename」); binmode PDF;打印PDF $內容,將文件寫入二進制文件。之後我可以在vim中打開它,並將其作爲文本閱讀,但部分看起來很有趣。任何嘗試用編碼寫入它都會毀壞文件。爲什麼PDF是一個例外? – 2016-04-03 02:21:47

0

編碼是使用字節的文本的表示。例如,

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

這是不可能存放在一個文件中的文本沒有編碼,因爲文件只能包含字節。

如果$mystring已經包含字節(編碼文本),但您說您有一個「Unicode字符串」,那麼您的代碼有效。


我相信你實現你的文件正在使用

cat file 

或類似破壞的結論。在這種情況下,您希望文件按照您的語言環境進行編碼。

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