【问题标题】:How to handle utf-8 text with Python 3?如何使用 Python 3 处理 utf-8 文本?
【发布时间】:2016-07-13 08:38:40
【问题描述】:

我需要解析各种文本源,然后将其打印/存储在某处。

每次遇到非 ASCII 字符时,我都无法正确打印它,因为它被转换为字节,而且我不知道如何查看正确的字符。

(我对 Python 很陌生,我来自 PHP,从来没有遇到过任何 utf-8 问题)

以下是代码示例:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import codecs
import feedparser

url = "http://feeds.bbci.co.uk/japanese/rss.xml"
feeds = feedparser.parse(url)
title = feeds['feed'].get('title').encode('utf-8')

print(title)

file = codecs.open("test.txt", "w", "utf-8")
file.write(str(title))
file.close()

我想打印并在文件中写入 RSS 标题(BBC 日语 - ホーム),但结果却是:

b'BBC 日语 - \xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xa0'

在屏幕上和文件上。有没有合适的方法来做到这一点?

【问题讨论】:

    标签: python-3.x utf-8 character-encoding


    【解决方案1】:

    在python3中bytesstr是两种不同的类型——而str用于表示任何类型的字符串(也是unicode),当你encode()某个东西时,你将它从它的str表示中转换它是特定编码的bytes 表示。

    在您的情况下,为了解码字符串,您只需要删除 encode('utf-8') 部分:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import codecs
    import feedparser
    
    url = "http://feeds.bbci.co.uk/japanese/rss.xml"
    feeds = feedparser.parse(url)
    title = feeds['feed'].get('title')
    
    print(title)
    
    file = codecs.open("test.txt", "w", encoding="utf-8")
    file.write(title)
    file.close()
    

    【讨论】:

    • 感谢 Dean,但在这种情况下,打印有这个异常,我之前遇到过,但无法修复:UnicodeEncodeError: 'charmap' codec can't encode characters in position 15-17: character maps到
    • 您使用的是哪个版本的python?这适用于我最新版本的 python...
    • Windows 上的 Python 3.5.1(v3.5.1:37a07cee5969,2015 年 12 月 6 日,01:54:25)
    • windows 上的默认控制台对 unicode 字符的打印不是很友好。文本是否正确写入文件?
    • 你是对的,文件被正确写入。似乎比预期的要容易!现在我必须修复 Windows 控制台问题。
    【解决方案2】:

    python3中的函数print(A)会先将字符串A转换为原始编码的字节,然后通过'gbk'编码打印出来。 所以如果要在utf-8中打印A,首先需要将A与gbk转换如下:

    print(A.encode('gbk','ignore').decode('gbk'))
    

    【讨论】:

    • 在 Python3 中 UTF-8 不是默认的吗?
    • “utf-8 default in python3”表示你正在编辑的是utf-8,但是在windows中,“print”方法只能打印可以用gbk编码的字符串。原因我已经回答过了。
    【解决方案3】:

    JSON 数据到 Unicode 支持日文字符

    def jsonFileCreation (messageData, fileName): 
       with open(fileName, "w", encoding="utf-8") as outfile:
             json.dump(messageData, outfile, indent=8, sort_keys=False,ensure_ascii=False)
    

    【讨论】:

    • 请将代码 sn-p 粘贴到 ``` 中并关闭。
    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2018-11-06
    • 2020-08-31
    • 2015-04-13
    • 2018-08-26
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多