比较非ASCII仅适用于IDLE

时间:2018-12-27 14:36:47

标签: python windows python-2.7 character-encoding

我正在做一个相当简单的代码,将欧洲葡萄牙语输入转换为巴西葡萄牙语-因此,有很多重音符号,例如á,é,À,ç等。

基本上,目标是从列表中查找文本中的单词,并将其替换为第二个列表中的BR单词。

代码如下:

#-*- coding: latin-1 -*-

listapt=["gestão","utilizador","telemóvel"]
listabr=["gerenciamento", "usuário", "celular"]

while True:

    #this is all because I need to be able to input multiple lines of text, seems to be working fine 

    print ("Insert text")
    lines = []

    while True:
        line = raw_input()
        if line != "FIM":
            lines.append(line)
        else:
            break
    text = '\n'.join(lines)    

    for word in listapt:
        if word in text:
            num = listapt.index(word)
            wordbr = listabr[num]
            print(word + " --> " + wordbr) #just to show what changes were made
            text = text.replace(word, wordbr)

    print(text)

我使用IDLE在Windows上运行代码,并双击.py文件。 使用IDLE时,该代码可以正常工作,但双击.py文件时,则不能匹配和替换字符。

3 个答案:

答案 0 :(得分:1)

我在这里看不到那个问题。

根据您对raw_input的使用,似乎您正在使用Python 2.x

这可能是因为我正在复制粘贴,以避免堆栈溢出,并且为您提供了不同的开发环境。

尝试在最新的Python 3解释器下运行脚本,并删除“#-*-encoding:”行。

这应该可以在您的代码中更快地解决UnicodeDecodeError问题,或者可以正常工作。

这里的问题是,Python 2.x在尝试在字节序列(Python 2.x字符串包含的内容,例如二进制文件内容)和有意义的文本(unicode,例如用于诸如用户信息显示汉字之类的东西),因为它对将人类可读文本如何编码为Python字符串中看到的字节序列做出了错误的假设。

这是Python 3试图解决更好/更少模棱两可的细节。

答案 1 :(得分:1)

这就是为什么代码在IDLE中能按预期工作,但不能从CMD或双击运行的原因:

  1. 您的代码是UTF-8编码的,不是latin-1编码的
  2. IDLE始终在UTF-8“输入/输出”模式下工作。
  3. 在Windows上,CMD / Doubleclicking将使用非UTF-8 8位语言环境。
  4. 当您的代码将输入与硬编码的字符串进行比较时,它是在字节级别进行的。在IDLE上,它会将UTF-8与硬编码的UTF-8进行比较。在CMD上,它会将非UTF-8 8bit与硬编码的UTF-8进行比较(如果您使用的是MacOS,它也可以工作)。

解决此问题的方法是确保您正在比较“苹果与苹果”。您可以通过将所有内容转换为相同的编码来实现。例如。将读取的输入转换为UTF-8,使其与硬编码的字符串匹配。更好的解决方案是将所有[byte]字符串转换为Unicode字符串(无编码的字符串)。如果您使用的是Python 3,这将是全自动的。

在Python 2.x上,您需要做三件事:

  1. u前缀所有源代码字符串,使其成为Unicode字符串:

    listapt=[u"gestão",u"utilizador",u"telemóvel"]
    listabr=[u"gerenciamento",u"usuário", u"celula]
    ...
    if line != u"FIM":
    

    或者,添加from __future__ import unicode_literals以避免更改您的所有代码。

  2. 使用正确的编码标头来编码文件。我怀疑您的标题应该读为utf-8。例如

    #-*- coding: utf-8 -*-
    
  3. raw_input的结果转换为Unicode。必须使用检测到的标准输入的编码来完成此操作:

    import sys
    line = raw_input().decode(sys.stdin.encoding) 
    

顺便说一句,更好的方法是对单词列表进行建模以替换为字典来使用字典。键是原始单词,值是替换单词。例如

words = { u"telemóvel": u"celula"}

答案 2 :(得分:-1)

首先尝试执行下面的代码,它将解决此问题:

var p = await db.WatchedProducts.FirstOrDefaultAsync(u => u.ApplicationUserId == user.Id &&
                                                          u.ProductId == id)