私はユニコードの地獄に落ちています。pythonで0xfbを印刷するには
UNIX上で私の環境で、Pythonの2.7.3
LC_CTYPE=zh_TW.UTF-8
LANG=en_US.UTF-8
私はここにコード
#! /usr/bin/env python
# encoding:utf-8
import sys
s=u"readable\n" # previous result keep in unicode string
s2="fb is not \xfb" # data read from binary file
s += s2
print s # method 1
print s.encode('utf-8') # method 2
print s.encode('utf-8','ignore') # method 3
print s.decode('iso8859-1') # method 4
# method 1-4 display following error message
#UnicodeDecodeError: 'ascii' codec can't decode byte 0xfb
# in position 0: ordinal not in range(128)
f = open('out.txt','wb')
f.write(s)
簡素化され、人間が読める形式で進エンコードされたデータをダンプしようとしている私はしたいです0xfbを出力します。
ここで詳しく説明します。キーは 's + = s2'です。 ここで、sは前のデコードされた文字列を保持します。s2はsに追加すべき次の文字列です。
次のように変更した場合は、書き込みファイルで発生します。
s=u"readable\n"
s2="fb is not \xfb"
s += s2.decode('cp437')
print s
f=open('out.txt','wb')
f.write(s)
# UnicodeEncodeError: 'ascii' codec can't encode character
# u'\u221a' in position 1: ordinal not in range(128)
私は強くあなたのコードが実際にerroringていると思われる
readable
fb is not \xfb
または
readable
fb is not 0xfb
あるout.txtをした結果に[ソリューション]
#! /usr/bin/env python
# encoding:utf-8
import sys
import binascii
def fmtstr(s):
r = ''
for c in s:
if ord(c) > 128:
r = ''.join([r, "\\x"+binascii.hexlify(c)])
else:
r = ''.join([r, c])
return r
s=u"readable"
s2="fb is not \xfb"
s += fmtstr(s2)
print s
f=open('out.txt','wb')
f.write(s)
'encode'を使うと*同じ*エラーメッセージが表示されますか? 'utf8'コーデックがデコードできません... *? – kojiro
\ xfbはUTF-8ではないので、それは何ですか? –
'\ xfb'はバイナリファイルから読み込まれたバイナリデータです。私は人間が読めるように '0xfbまたは\ xfb'として表示したい。 –