2016-09-26 10 views
4

UTF-8でエンコードされた文字列を返すデバイスがあります。私はそれをバイト単位でしか読み取ることができず、読み取りは値0x00のバイトで終了します。Python - UTF-8でエンコードされた文字列をバイト単位で読み取る

他の人が私のデバイスにアクセスして文字列を返すためのPython 2.7関数を作っています。デバイスがちょうどASCIIに戻ったときに、以前の設計では

は、私はループでこれを使用:xは、デバイスから読み込まれた最新のバイト値である

x = read_next_byte() 
if x == 0: 
    break 
my_string += chr(x) 

デバイスはUTF-8でエンコードされた文字列を返すことができますが、UTF-8でエンコードされた文字列/ユニコードに変換する方法はわかりません。

chr(x)私はunichr(x)を使用しても問題はないと思われますが、渡された値は完全なユニコード文字の値であると仮定していますが、0-255の部分しか持っていません。

私はデバイスから返されたバイトを、Pythonで使用できる文字列に変換しても、完全なUTF-8文字列を扱うにはどうすればよいですか?

同様に、PythonでUTF-8文字列を指定した場合、デバイスに送信してUTF-8を維持するために、個々のバイトに分割する方法を教えてください。

答えて

3

正しい解決策は、あなたが終端バイトをヒットするまで、その時点でUTF-8に変換読み込むことであろう(あなたはすべての文字を持っている):

mybytes = bytearray() 
while True: 
    x = read_next_byte() 
    if x == 0: 
     break 
    mybytes.append(x) 
my_string = mybytes.decode('utf-8') 

上記の最も直接的な翻訳であります元のコード。

# If this were Python 3 code, you'd use the bytes constructor instead of bytearray 
my_string = bytearray(iter(read_next_byte, 0)).decode('utf-8') 
+0

ファンタスティック:興味深いことに、これはtwo arg iterが劇的に1ラインの作業ができますPythonのイテレータにあなたのCスタイルのステートフルバイトリーダー機能を作ることによって、コードを簡素化するために使用することができ、それらの例です。それはうまくいくようです。逆を行い、bytearrayをエンコードするには、私はこの権利を使うことができますか? 'my_bytes = bytearray(my_string、 'utf-8')' そして個々のバイトを送るために 'my_bytes'をループします。 – Will

+0

@ウィル:はい。 Py3では、 'my_string.encode( 'utf-8')'(これはPythonの 'bytearray'sのように動作する' bytes'を取得します)をやや直感的に行います。しかしPy2では、 'encode'は' str'を取得します。これは文字の 'len' 1' str'を使って、 'int'sは0-255ではなく' itrates'を返します。いずれにせよ、結果を反復して書き込み関数を呼び出すことができます: 'forbearray(my_string、 'utf-8'):write_one_byte(b)' – ShadowRanger

関連する問題