82

これは Python 101 タイプの質問ですが、文字列入力をバイトに変換するように見えるパッケージを使用しようとしたとき、しばらく困惑しました。

以下に示すように、私は自分で答えを見つけましたが、何が起こっているのかを明らかにするのに時間がかかったので、ここに記録する価値があると感じました. これは Python 3 に一般的であるように思われるため、私が遊んでいた元のパッケージについては言及していません。エラーではないようです(特定のパッケージに、私が文字列として理解したものを明らかに生成していない.tostring()メソッドがあったというだけです...)

私のテストプログラムは次のようになります。

import mangler                                 # spoof package

stringThing = """
<Doc>
    <Greeting>Hello World</Greeting>
    <Greeting>你好</Greeting>
</Doc>
"""

# print out the input
print('This is the string input:')
print(stringThing)

# now make the string into bytes
bytesThing = mangler.tostring(stringThing)    # pseudo-code again

# now print it out
print('\nThis is the bytes output:')
print(bytesThing)

このコードからの出力は次のようになります。

This is the string input:

<Doc>
    <Greeting>Hello World</Greeting>
    <Greeting>你好</Greeting>
</Doc>


This is the bytes output:
b'\n<Doc>\n    <Greeting>Hello World</Greeting>\n    <Greeting>\xe4\xbd\xa0\xe5\xa5\xbd</Greeting>\n</Doc>\n'

そのため、ASCII 以外の文字が gobbledegook に変換されることを避けるために、バイトと文字列の間で変換できる必要があります。

4

4 に答える 4

119

上記のコード サンプルの「mangler」は、これと同等のことを行っていました。

bytesThing = stringThing.encode(encoding='UTF-8')

これを記述する方法は他にもあります (特に を使用しbytes(stringThing, encoding='UTF-8')ますが、上記の構文により、何が起こっているのか、また文字列を復元するために何をすべきかが明確になります。

newStringThing = bytesThing.decode(encoding='UTF-8')

これを行うと、元の文字列が復元されます。

UTF str(bytesThing)-8、つまりstr(bytesThing, encoding='UTF-8'). エンコーディングが指定されていない場合、エラーは報告されません。

于 2012-12-23T11:22:01.973 に答える
17

python3ではbytes()、と同じ形式のメソッドがありますencode()

str1 = b'hello world'
str2 = bytes("hello world", encoding="UTF-8")
print(str1 == str2) # Returns True

ドキュメントでこれについて何も読んでいませんでしたが、おそらく適切な場所を探していませんでした。encodeこのようにして、文字列を明示的にバイト ストリームに変換し、 andを使用するよりも読みやすくすることができ、引用符の前decodeにプレフィックスを付ける必要がありませんb

于 2014-05-22T19:03:22.127 に答える