[英]how to write utf-8 string to utf-8 file on utf-8 machine with python
這不是第一次,這讓我感到困惑:
使用codecs.open
打開文件:
cfh = codecs.open('/tmp/ddfh', 'wb', 'utf-8')
嘗試寫字符串sa:
In [109]: sa
Out[109]: '\xe6\x96\xb0 \xe9\x97\xbb\xe3\x80\x80\xe7\xbd\x91 \xe9\xa1\xb5\xe3\x80\x80\xe8\xb4\xb4 \xe5\x90\xa7\xe3\x80\x80\xe7\x9f\xa5 \xe9\x81\x93\xe3\x80\x80\xe9\x9f\xb3 \xe4\xb9\x90\xe3\x80\x80\xe5\x9b\xbe \xe7\x89\x87\xe3\x80\x80\xe8\xa7\x86 \xe9\xa2\x91\xe3\x80\x80\xe5\x9c\xb0 \xe5\x9b\xbe'
In [110]: print sa
新 聞 網 頁 貼 吧 知 道 音 樂 圖 片 視 頻 地 圖
In [111]: sa.encode()
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
/home/za/tmp/<ipython-input-111-dea686030e89> in <module>()
----> 1 sa.encode()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
In [112]: sa.decode()
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
/home/za/tmp/<ipython-input-112-a79b22010b0e> in <module>()
----> 1 sa.decode()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
In [113]: sa.encode('utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
/home/za/tmp/<ipython-input-113-ed97f8f61eb5> in <module>()
----> 1 sa.encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
In [114]: sa.decode('utf-8')
Out[114]: u'\u65b0 \u95fb\u3000\u7f51 \u9875\u3000\u8d34 \u5427\u3000\u77e5 \u9053\u3000\u97f3 \u4e50\u3000\u56fe \u7247\u3000\u89c6 \u9891\u3000\u5730 \u56fe'
In [115]: cfh.write(sa.decode('utf-8'))
它可以在上面運行,但是與另一台計算機,同一台Ubuntu計算機,同一台$ LANG env 失敗 。 我一直在打“'ascii'編解碼器無法....”
誰能指出我的好醫生? 關於模塊codecs
的官方文檔對我不好。
===
問題來自代碼:
# encoding=utf-8
# ......
def write_video_info_file(folder, filename, infos):
# infos : a list of list, lines of text grouped by topic, results of language translations.
absfn = os.path.join(folder, filename)
with codecs.open(absfn, mode='wb', encoding='utf-8') as fh:
for vinfo in infos:
for v in vinfo:
fh.write(v)
fh.write("\n\n" + vi_delimit + "\n\n")
這在我的本地計算機上經過測試,可以正常運行,並部署到遠程計算機上,然后得到了很多: UnicodeDecodeError: 'ascii' codec can't
。
之后,幾乎所有mode=
打開,沒有嘗試編解碼器。
$ echo $LANG # en_US.UTF-8
Python 2.7.3
Ubuntu 12.04
LANG = zh_CN.UTF-8
語言=
LC_ALL =
===
我得到了解決方案,使用它來確保所有字符串都是utf-8:
if isinstance(mystring, str):
mystring = mystring.decode('utf-8')
您的數據已被編碼為UTF-8。 只需打開沒有 codecs.open()
的文件並直接寫入數據即可:
with open('/tmp/ddfh', 'wb') as output:
output.write(sa)
Unicode編碼/解碼錯誤通常是由於混合字節字符串和unicode字符串而發生的; 連接,比較,需要使用str.join()
時使用unicode.join()
等。
您可能想要閱讀Python和Unicode:
每個軟件開發人員絕對,肯定必須絕對了解Unicode和字符集(無借口!)作者:Joel Spolsky
Ned Batchelder的實用Unicode
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.