1. ホーム
  2. string

[解決済み] Python 3でバイトと文字列を変換するには?

2023-07-12 22:43:34

質問

これは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'

そのため、非アスキー文字がごちゃごちゃになってしまうのを防ぐために、バイトと文字列の間で変換できるようにする必要があるのです。

どのように解決するのか?

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

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

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

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

このようにすると、元の文字列が復元されます。

注意点としては str(bytesThing) を使うと、特に UTF-8 を要求しない限り、Unicode に変換することなく、すべてのgobbledegook を書き写すだけです。 str(bytesThing, encoding='UTF-8') . エンコーディングが指定されていない場合、エラーは報告されません。