8

バイナリ エスケープ シーケンスの文字列を\x05\x03\x87、表示どおりに出力する必要があります。それらを印刷しようとすると、Python は奇妙な非 ASCII 文字の文字列を返します。それらを文字列リテラルとして出力するにはどうすればよいですか?

4

3 に答える 3

15

repr

>>> a='\x05\x03\x87'
>>> print a
?
>>> print repr(a)
'\x05\x03\x87'

編集

Svenは、OPが印刷可能なものであっても、すべての文字を16進数でダンプすることを望むかもしれないと指摘しています。その場合、私が考えることができる最良の解決策は次のとおりです。

>>> print ''.join(map(lambda c:'\\x%02x'%c, map(ord, a)))
\x05\x03\x87

追加編集

4年後、これはより速く、より読みやすくなっているかもしれないと思いました:

>>> print ''.join(map(lambda c:'\\x%02x'% ord(c), a))

あるいは

>>> print ''.join([ '\\x%02x'% ord(c) for c in a ])
于 2012-11-06T23:34:55.033 に答える
4

文字列エスケープエンコーディングを使用します:

>>> print '\x05\x03\x87'.encode('string-escape')
\x05\x03\x87

ドキュメントから:

Pythonソースコードで文字列リテラルとして適切な文字列を生成します

repr()これは本質的に、それらの厄介な引用符なしで、と同じものを提供します。

Malvolioの回答と同様に、これは、印刷できない文字に対してのみエスケープされたバージョンが必要であることを前提としていることに注意してください。これが必要でない場合は、明確にしてください。

于 2012-11-06T23:35:22.150 に答える
2

の独自のサブクラスを派生させて、str希望どおりに動作および出力できますが、通常の文字列が使用できるほぼすべての場所で使用でき、すべて同じ組み込みメソッドがあります。

ご覧のとおり、この例では、含まれているすべての文字の 16 進値が、通常どおり印刷可能かどうかに関係なく印刷されます。もちろん、必要に応じて別の方法で実行することもできます。

class HexStr(str):
    def __repr__(self):
        return "'" + ''.join('\\x{:02x}'.format(ord(ch)) for ch in self) + "'"
    __str__ = __repr__

a = HexStr('abc\x05\x03\x87')
print a
print str(a)
print repr(a)

出力:

'\x61\x62\x63\x05\x03\x87'
'\x61\x62\x63\x05\x03\x87'
'\x61\x62\x63\x05\x03\x87'
于 2012-11-07T09:08:58.273 に答える