2017-03-15 13 views
1

ファイルに書き込むときに文字エンコーディングを変換する必要がありますが、fuction "reencode-output-port"を使用すると、文字列の最後の部分はファイルに書き込まれます。機能 "reencode-output-port"がラケットで正しく動作しない

は例えば、私は、コードのこの部分を実行します。

(call-with-output-file "test.txt" (lambda (out) 
    (display "abc" (reencode-output-port out "gbk"))) #:exists 'truncate) 

ファイルtest.txtのは何も含まれていません。

ファイルに十分長い文字列を書き込むと、最後の部分は常に失われます。

私のコードに関する問題はありますか?

新しいファイルポートを閉じなかったことに気付きました。正しいコードは次のとおりです。

再アウト、および行われたときに、それを閉じるために、新しいファイルポートを結合、だ
(call-with-output-file "test.txt" (lambda (out) 
(let [(re-out (reencode-output-port out "gbk"))] (display "abc" re-out) 
    (close-output-port re-out))) 
#:exists 'truncate) 

しかし、なぜcall-with-output-fileにエンコードパラメータが含まれていないのでしょうか?私はclose-actionを避けるためにcall-with-output-fileを使用しています。今度は別のファイルに直面しなければなりません。

答えて

0

これは機能しますか?あなたはgbk以外のエンコーディングを使用する場合

(call-with-output-file "test.txt" (lambda (out) 
    (current-output-port (reencode-output-port (current-output-port) "gbk")) 
    (display "abc") 
    #:exists 'truncate)) 

また何が起こりますか?

+0

ありがとう、しかし、それは私が意味するものではありません。 – David

+0

しかし、それは動作しますか?もしそうなら、少なくとも、エンコーディングを行っているライブラリが正しくロードされていることになります。 – soegaard

+0

"reencode-output-port"が正常に動作していることを確認しましたが、問題は新しい出力ポートを閉じなかったことです。私は私のポスト(ポストの後編集)で解決策を説明しました。 – David

関連する問題