【问题标题】:Why can't I normalize this random unicode string?为什么我不能规范化这个随机的 unicode 字符串?
【发布时间】:2013-01-02 07:51:33
【问题描述】:

我需要评估 unicode 字符串的 levenshtein 编辑距离,这意味着需要对包含相同内容的两个字符串进行归一化以避免编辑距离偏差。

这是我为测试生成随机 unicode 字符串的方法:

def random_unicode(length=10):
    ru = lambda: unichr(random.randint(0, 0x10ffff))
    return ''.join([ru() for _ in xrange(length)])

这是失败的简单测试用例:

import unicodedata
uni = random_unicode()
unicodedata.normalize(uni, 'NFD')

这是错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

我检查以确保 uni 确实是一个 unicode 对象:

u'\U00020d93\U000fb2e6\U0005709a\U000bc31e\U00080262\U00034f00\U00059941\U0002dd09\U00074f6d\U0009ef7a'

谁能启发我?

【问题讨论】:

  • 输入参数出现反转。

标签: python unicode normalization python-unicode unicode-normalization


【解决方案1】:

你已经切换了normalize的参数。来自the relevant documentation:

unicodedata.normalize(form, unistr)

返回 Unicode 字符串 * unistr* 的正常形式 form。 form 的有效值为“NFC”、“NFKC”、“NFD”和“NFKD”。

first 参数是表单,second 是要规范化的字符串。这工作得很好:

unicodedata.normalize('NFD', uni)

【讨论】:

  • ...我是个白痴。谢谢!确实应该有一个断言错误或明确指出第一个参数需要一个 unicode 字符串 =/ 正如他们所说的“可能出错的地方会出错”......
  • 有趣的是python没有告诉你参数一不是有效的范式...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2011-12-10
  • 2011-06-20
  • 2016-10-16
  • 2012-02-07
  • 2018-04-16
  • 1970-01-01
相关资源
最近更新 更多