【问题标题】:How to find accented characters in a string in Python?如何在 Python 中的字符串中查找重音字符?
【发布时间】:2012-10-30 19:35:48
【问题描述】:

我有一个包含句子的文件,其中一些是西班牙语,并且包含重音字母(例如 é)或特殊字符(例如 ¿)。我必须能够在句子中搜索这些字符,以便确定该句子是西班牙语还是英语。

我已尽力做到这一点,但没有成功。以下是我尝试过的解决方案之一,但显然给出了错误的答案。

sentence = ¿Qué tipo es el? #in str format, received from standard open file method
sentence = sentence.decode('latin-1')
print 'é'.decode('latin-1') in sentence
>>> False

我也尝试使用 codecs.open(.., .., 'latin-1') 来读取文件,但这没有帮助。然后我尝试了 u'é'.encode('latin-1'),但还是不行。

我没有想法,有什么建议吗?

@icktoofay 提供了解决方案。我最终保留了文件的解码(使用 latin-1),但随后使用 Python unicode 作为字符(u'é')。这需要我在脚本顶部设置 Python unicode 编码。最后一步是使用unicodedata.normalize 方法对两个字符串进行规范化,然后进行相应的比较。感谢你们的及时和大力支持。

【问题讨论】:

  • 你怎么知道文件是 Latin-1,而不是 UTF-8 或 Windows 编码?
  • 我不知道,Latin-1 是我的最佳猜测。如何检查?
  • @user1411331:尝试使用 UTF-8 解码。最有可能的是,如果它是 UTF-8,它将成功,而如果它尝试使用 UTF-8 解码 Latin-1,它将失败。尝试使用 Latin-1 解码 UTF-8 不会失败,但会给出错误数据,例如 ¿Qué tipo es el?
  • 使用 [od] 之类的工具查看实际文件中的字节数。如果文件是 UTF-8,'é' 使用超过一个字节进行编码。区分 CP1252 和 Latin-1 比较棘手,您需要查看它们各自的规范并找出两者中哪个字符的编码不同。
  • 我猜它不是 Latin-1,因为这种编码主要用于 Unixen,而大部分 Linux 已经过渡到使用 UTF-8。

标签: python string unicode


【解决方案1】:

在检查之前在字符串上使用unicodedata.normalize

说明

Unicode 提供多种形式来创建某些字符。例如,á 可以用单个字符 á 或两个字符表示:a,然后“在上面加上一个 ´”。规范化字符串将强制它使用一种或另一种表示形式。 (它归一化的表示取决于您作为form 参数传递的内容)

【讨论】:

  • 为了更有趣,添加额外的组合标记! á́́́́́́́́́́́́́́́́́́́
  • @user1411331:也许您的 Python 脚本是 UTF-8 编码的,但数据库中的数据是 Latin-1。尝试将spaChar 设置为spaChar = unicodedata.normalize('NFKD', u'á')。这可能使 Python 需要在文件顶部添加 # encoding: utf-8 注释。
  • 是的,我不应该这样做吗?我什至尝试了所有的表单选项,都没有奏效。这是我的代码:sentence = sentence.decode('latin-1')sentence = unicodedata.normalize('NFKD', sentence)spaChar = 'á'.decode('latin-1')spaChar = unicodedata.normalize('NFKD', spaChar)print spaChar in sentence>>> False
  • 呜呼,成功!!最后一条评论基本上结合了 utf-8 和 latin-1 工作,谢谢!!!
【解决方案2】:

我怀疑您的终端使用的是 UTF-8,所以 'é'.decode('latin-1') 不正确。只需使用 Unicode 常量而不是 u'é'

要在脚本中正确处理 Unicode,请声明脚本和数据文件编码,并对传入数据进行解码,并对传出数据进行编码。对脚本中的文本使用 Unicode 字符串。

示例(以 UTF-8 保存脚本):

# coding: utf8
import codecs
with codecs.open('input.txt',encoding='latin-1') as f:
    sentence = f.readline()
if u'é' in sentence:
    print u'Found é'

请注意,print 在终端编码中隐式编码输出。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2014-11-29
    • 2018-08-27
    • 2015-07-25
    • 1970-01-01
    • 2014-02-27
    • 2019-11-04
    • 2018-05-15
    • 2021-08-13
    相关资源
    最近更新 更多