8

Python 3では、バイト文字列を通常の文字列に補間して、Python 2と同じ動作を得るにはどうすればよいですか(つまり、bプレフィックスや二重円記号なしでエスケープコードだけを取得します)?

例えば:

Python 2.7:

>>> x = u'\u041c\u0438\u0440'.encode('utf-8')
>>> str(x)
'\xd0\x9c\xd0\xb8\xd1\x80'
>>> 'x = %s' % x
'x = \xd0\x9c\xd0\xb8\xd1\x80'

Python 3.3:

>>> x = u'\u041c\u0438\u0440'.encode('utf-8')
>>> str(x)
"b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'"
>>> 'x = %s' % x
"x = b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'"

Python 3ではb、出力にプレフィックスと二重アンダースコアが含まれていることに注意してください。私が取得したい結果は、Python2で取得した結果です。

4

3 に答える 3

5

Python 2には、型strとがありunicodeます。はUnicode文字列であるのstrに対し、は単純なバイト文字列を表します。unicode

Python 3の場合、これは変更されました。これstrunicodePython 2にbyteあったものであり、Python2にあったものstrです。

したがって、そうするときは、暗黙的であるため、実際にはプレフィックスを("x = %s" % '\u041c\u0438\u0440').encode("utf-8")省略できます。uPythonで明示的に変換されないものはすべてUnicodeです。

これにより、Python3の最後の行が生成されます。

 ("x = %s" % '\u041c\u0438\u0440').encode("utf-8")

ここで、最終結果の後にエンコードする方法を説明します。これは、常に行う必要があります。着信オブジェクトを取得し、Unicodeにデコードして(どのように実行しても)、出力を作成するときに、選択したエンコードでエンコードします。生のバイト文字列を処理しようとしないでください。それはただ醜く非推奨の振る舞いです。

于 2013-03-13T16:12:06.923 に答える
5

Python 3の例では、Python 2で行っているようなバイト文字列ではなく、Unicode文字列に補間しています。

Python 3では、bytes補間(文字列の書式設定またはwhat-have-you)をサポートしていません。

連結するか、Unicodeをすべて使用して、補間した場合にのみエンコードします。

b'x = ' + x

また

'x = {}'.format(x.decode('utf8')).encode('utf8')

また

x = '\u041c\u0438\u0440'  # the u prefix is ignored in Python 3.3
'x = {}'.format(x).encode('utf8')
于 2013-03-13T16:08:33.537 に答える
0

Python 2では、バイト文字列と通常の文字列は同じであるため、によって変換は行われませんstr()。Python 3では、文字列は常にUnicode文字列であるためstr()、バイト文字列の変換が行われます。

代わりに、必要な処理を行う独自の変換を行うことができます。

x2 = ''.join(chr(c) for c in x)
于 2013-03-13T16:12:21.340 に答える