2010-12-28 15 views
2

バイナリファイルにユニコード(utf-8)を書き込む方法が不思議です。ここに背景があります:私は40バイトのヘッダ(10 ints)と、可変数のトリプルint構造体を持つテーブルを持っています。これらを書くことはケーキでした。Pythonでバイナリファイルにユニコードを書く

ここで、ファイルの最後に一連の文字列を追加します。通常のASCIIベースの文字列を書く

は簡単です:

value = ('ab') 
s = struct.Struct('2s') 
packed_data = s.pack(value) 

私はInterpret strings as packed binary dataからこれを行う方法を学びました。

しかし、ユニコード(utf-8)ベースの文字列でこれを行う方法はありますか?

アイデア?誰もこれを前にしたことがありますか?

+1

あなたが達成しようとしていることは明確ではありません。 UTF-8は_character_ dataをエンコードする方法です。バイナリデータの書き込みには関係がありません。実際に、UTF-8ストリームに任意のバイナリデータを書き込むと、誤って無効なエンコーディングが導入された場合にエラーが発生するはずです。いくつかのサンプルデータと期待される出力を明確にしてください。 –

+0

UTF-8 *は*バイナリデータであり、Unicodeではありません。 Unicodeの標準的なリンク:http://www.joelonsoftware.com/articles/Unicode.html –

答えて

4

ユニコード!= UTF-8。 UTF-8はUnicodeのバイナリエンコーディングなので、ASCII文字列と同じようにUTF-8文字列を書いてください。エンコードされた文字列をパックする必要はありません。これはすでに「単なるバイト」です。

# coding: utf8 
import struct 
text = u'我是美国人。' 
encoded_text = text.encode('utf8') 

# proof packing is redundant... 
format = '{0}s'.format(len(encoded_text)) 
packed_text = struct.pack(format,encoded_text) 
print encoded_text == packed_text # result: True 

ユニコード文字列をエンコードして、パックされたintを書き込んだ後にファイルに追加するだけです。

+0

パックを使用することによって、私は紐で他のバイナリデータを書いていました。彼がいない場合、パックは確かにreduntandです... –

+0

はい、それは文字列を特定の長さにゼロパッドするために使用することができます。彼は何をしたいのかだけに依存します。 –

2

unicode.encode( 'utf-8')は、UTF-8でエンコードされたバイト文字列を返します。梱包前の長さを確認してください。

関連する問題