【问题标题】:How to recover symbols from utf-8如何从 utf-8 中恢复符号
【发布时间】:2020-04-22 04:52:34
【问题描述】:

Python 2.7 中的编码很难理解。有人可以向我解释如何获取这些字符串的符号吗?

这是我的 unicode 字符串:

my_str = u'MFADCINEMve000301119 FACTURE EFAD CIN\u2019troD+000000035165 EUR FACTURE EFAD CIN\u2019trop\xe9MA SAS 2019/10198'

我想把它转换成“\u2019”和“\xe9”。

我已经尝试my_str.encode('utf-8') 但这给了我:

'MFADCINEMve000301119 FACTURE EFAD CIN\xe2\x80\x99troD+000000035165 EUR FACTURE EFAD CIN\xe2\x80\x99trop\xc3\xa9MA SAS 2019/10198'

与其他编码符号。我不明白,我只是想将它们替换为 'é 符号...

更新:

更新 2:

这是我的代码:

day = datetime.now().day
        month = datetime.now().strftime("%b")
        year = datetime.now().strftime("%Y")
        filename = "ventes{0}{1}{2}.csv".format(day, month, year)

        with io.open(filename, 'w', encoding='utf-8') as file_data:
            csvwriter = csv.writer(file_data, delimiter=',', quotechar="", quoting=csv.QUOTE_NONE)

            for line in res:
                csvwriter.writerow([x for x in line])  # Occurs error bellow

        file_data.seek(0)

        out = base64.encodestring(file_data.read())

即出现此错误(不一定明确):

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 546, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 583, in dispatch
    result = self._call_function(**self.params)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 319, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 118, in wrapper
    return f(dbname, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 316, in checked_call
    return self.endpoint(*a, **kw)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 812, in __call__
    return self.method(*args, **kw)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 412, in response_wrap
    response = f(*args, **kw)
  File "/usr/lib/python2.7/dist-packages/openerp/addons/web/controllers/main.py", line 953, in call_button
    action = self._call_kw(model, method, args, {})
  File "/usr/lib/python2.7/dist-packages/openerp/addons/web/controllers/main.py", line 941, in _call_kw
    return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 399, in old_api
    result = method(recs, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/addons_eggs/adquat_export_CEGID/models/export_cegid.py", line 31, in validate
    move_ids = self._context.get('active_ids', [])
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 136: ordinal not in range(128)

这段代码有什么问题?请帮忙!

【问题讨论】:

  • 在您的更新中,字节写入正确,但是您使用错误的编码打开了文件(根据我的经验/测试,很可能是 WIndows CP1252)。使用 UTF-8 编码重新打开它,您应该会看到正确的字符。
  • 在您的第二次更新中,该错误不是来自显示的代码。 Python 2 中的 cab 模块不支持 Unicode 字符串。 Python 3 有更好的支持,Python 2 不再受支持。如果不切换,cab 模块文档底部有一个示例,说明如何处理 Unicode,或者获取 3rd 方 unicodecsv 模块。
  • 嗯好吧..我会调查的,非常感谢!!

标签: python python-2.7 encoding utf-8 ascii


【解决方案1】:

默认情况下,Python 2 仅将字符串表示形式 (repr()) 显示为 ASCII。 ASCII 范围 (0-127) 之外的任何字符都显示为转义码(\xnn\unnnn)。仅当您 print 字符时,该字符才能正确显示,并且仅当终端编码和字体支持该字符时。

例如:

>>> s = u'\xe9'
>>> s             # This is a representation of the string useful for debugging.
u'\xe9'
>>> len(s)        # It is still only length 1.
1
>>> print(s)      # It displays correctly when printed.
é

默认情况下,我的终端编码不支持所有 Unicode 字符,所以你的另一个例子不支持print。但是,调试表示会:

>>> s = u'\u2019'
>>> s
u'\u2019'
>>> len(s)
1
>>> print(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\dev\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2019' in position 0: character maps to <undefined>

如果您将 Unicode 字符串写入文件,则必须对其进行编码。使用您想要的编码打开一个文件并写入 Unicode 字符串。最好使用 UTF-8 作为编码,因为它支持所有 Unicode 字符。使用io.open。它与 Python 3 兼容(您应该尽快切换到它)并支持 encoding 参数。

import io

my_str = u'MFADCINEMve000301119 FACTURE EFAD CIN\u2019troD+000000035165 EUR FACTURE EFAD CIN\u2019trop\xe9MA SAS 2019/10198'
with io.open('out.txt','w',encoding='utf8') as f:
    f.write(my_str)

请注意,您必须在支持 UTF-8 的编辑器中查看文件。例如,在我的终端上使用默认的cp437 编码,它看起来像:

C:\>type out.txt
MFADCINEMve000301119 FACTURE EFAD CIN’troD+000000035165 EUR FACTURE EFAD CIN’tropéMA SAS 2019/10198

但如果我将编码更改为 cp65001 (UTF-8):

C:\>chcp 65001
Active code page: 65001

C:\>type out.txt
MFADCINEMve000301119 FACTURE EFAD CIN’troD+000000035165 EUR FACTURE EFAD CIN’tropéMA SAS 2019/10198

更多阅读:

【讨论】:

  • 您好,非常感谢您花这么多时间回复我。我理解更好的 unicode,但是......这对我不起作用......对不起,但你能看到我用我的代码更新的答案并告诉我我有什么问题吗?谢谢大家!!
【解决方案2】:

你只需要print(my_str.encode('utf-8'))

这将为您提供输出:

MFADCINEMve000301119 FACTURE EFAD CIN'troD+000000035165 EUR FACTURE EFAD CIN'tropéMA SAS 2019/10198

【讨论】:

  • 哦,好吧。感谢您的回复,但它只适用于打印方法?我的目的是在 CSV 文件中写入这一行,并查看我更新的问题在我的文件中打印的内容......有什么解决方案吗?非常感谢!!
  • encode() 只是将 unicode 转义 (\u2019) 转换为等效字节 (\xe2...)。 print 能够解释字节以显示正确的字符 - 写入文件将执行相同的操作,因此您将按照预期在文件中写入字符。
猜你喜欢
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多