python - 在 Python 2.7 中,Unicode 文本表示为 u'xxxx 而不是日语

标签 python python-2.7 unicode encoding

多年来,当我处理许多日语文本文件时,我在 Python 中的 Unicode 方面遇到了很多困难,因此我熟悉使用 .encode("utf-8") 将日语文本重新显示为日语显示来自你的xxxx。我没有收到任何编码/解码错误。但是我从 unicode 文件中读取、操作然后写回新文件的文本被表示为 u'xxxx 字符串,而不是原始的日语文本。我在多个地方尝试过 .encode() 和 .decode() ,而且根本没有使用它们,每次都得到相同的结果。欢迎提出任何建议。

具体来说,我正在使用 Scrapy 库编写一个蜘蛛,它从它抓取的文件中获取文本,提取文本位来构造新文件的文件名,然后将 HTML 文件的第一个 div 作为字符串写入进入新文件。

更让我困惑的是,我用来创建文件名的文本位都以日语呈现,文件名本身也是如此。是因为我在 div 上使用 str() ,所以我将 u'xxxx 作为文件的内容吗?请在代码末尾看到这一行。

这是我的完整代码(请忽略其中的一些代码是多么的hacky):

def parse_item(self, response):
    original = 0
    author = "noauthor"
    title = "notitle"
    year = "xxxx"
    publisher = "xxxx"
    typer = "xxxx"
    ispub = 0
    filename = response.url.split("/")[-1]
    if "_" in filename:
        filename = filename.split("_")[0]
        if filename.isdigit():
            title = response.xpath("//h1/text()").extract()[0].encode("utf-8")
            author = response.xpath("//h2/text()").extract()[0].encode("utf-8")
            ID = filename
            bibliographic_info = response.xpath("//div[2]/text()").extract()
            for subyear in bibliographic_info:
                ispub = 0
                subyear = subyear.encode("utf-8").strip()
                if "初出:" in subyear:
                    publisher = subyear.split(":")[1]
                    original = 1
                    ispub = 1
                if "入力:" in subyear:
                    typer = subyear.split(":")[1]
                if len(subyear) > 1 and (original == 1) and (ispub == 0):
                    counter = 0
                    while counter < len(subyear):
                        if subyear[counter].isdigit():
                            break
                        counter+=1
                    if counter != len(subyear):
                        year = subyear[counter:(counter+4)]
                    original = 0
    body = str(response.xpath("//div[1]/text()").extract())
    new_filename = author + "_" + title + "_" + publisher + "_" + year + "_" + typer + ".html"
    file = open(new_filename, "a")
    file.write(body.encode("utf-8")  
    file.close()

最佳答案

# -*- coding: utf-8 -*-
# u'初出' and u'\u521d\u51fa' are different ways to specify *the same* string
assert u'初出' == u'\u521d\u51fa'
#XXX don't mix Unicode and bytes!!!
assert u'初出' != '初出' and u'初出' != '\u521d\u51fa' 

根本不要使用带有 Unicode 字符串作为参数的 str(),而是使用显式的 .encode()。 除非必要,否则不要调用.encode().decode();使用 Unicode 三明治代替:

  • 将从外界接收的字节解码为 Unicode
  • 在脚本中保留 Unicode
  • 最后编码为字节以保存到文件,通过网络发送。

第一步和最后一步都可能是隐式的,即您的程序可能只能看到 Unicode 文本。

请注意,这是三件不同的事情:

  • 使用字符串文字(unicode 转义、源代码编码、原始字符串文字)指定字符串时,字符串在源代码中的外观
  • 字符串的内容
  • 打印出来后的样子(repr(),“backslashreplace”错误处理程序)

如果您在输出中看到 u'...';这意味着在某个时刻 repr(unicode_string) 被调用。它可能是隐式的,例如通过 print([unicode_string]),因为在将列表转换为字符串时会调用 repr()

print(u'\u521d\u51fa')       # -> 初出 #NOTE: no u'', \u..
print(repr(u'\u521d\u51fa')) # -> u'\u521d\u51fa'

关于python - 在 Python 2.7 中,Unicode 文本表示为 u'xxxx 而不是日语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25798353/

相关文章:

python - 使用 xlsxwriter 中的 Workbook 对象时,Workbook 对象没有属性 'add_sheet'

javascript - 在javascript中将ú转换为u

python - FFmpegPCMaudio 在我的服务器上不起作用,但它在我的计算机上工作

python - 如何在python中轻松显示顶层数据结构

python - 您可以直接从数据库中使用 ffmpeg 拆分文件吗?

python-2.7 - 如何在 Keras 中使用 log_loss 作为指标?

python - 如何让pypi正确识别操作系统

python - 在 python selenium 中,如何找到元素的可见性?

python - jupyter Notebook 如何解析 unicode 变量名称以及为什么会出现错误?

python - 使用 .join() 插入一个 unicode 字符