0

不是第一次,这让我感到困惑:

使用以下命令打开文件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 环境中失败。我一直在点击“'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")

这在我的本地机器上测试OK,并部署到远程机器上,然后它得到了很多: UnicodeDecodeError: 'ascii' codec can't.

在它之后,几乎所有mode=的,没有尝试过编解码器就打开了。

$ echo $LANG  #  en_US.UTF-8

Python 2.7.3

Ubuntu 12.04

LANG=en_US.UTF-8

语言=

LC_ALL=

===

我得到了解决方案,使用它来确保所有字符串都是 utf-8:

if isinstance(mystring, str):
    mystring = mystring.decode('utf-8')
4

1 回答 1

3

您的数据编码为 UTF-8。只需打开文件而不 codecs.open()直接写入数据:

with open('/tmp/ddfh', 'wb') as output:
    output.write(sa)

Unicode 编码/解码错误通常是因为您混合了字节字符串和 Unicode 字符串;连接、比较、str.join()在需要时使用unicode.join()等。

你可能想阅读 Python 和 Unicode:

于 2013-04-10T20:39:05.283 回答