【问题标题】:What does unicodedata.normalize do in python?unicodedata.normalize 在 python 中做了什么?
【发布时间】:2019-01-13 13:23:46
【问题描述】:

我有以下代码:

import unicodedata
my_var = "this is a string"
my_var2 = " Esta es una oración que está en español "
my_var3 = unicodedata.normalize('NFKD', my_var2).encode('ascii', 'ignore')
output = my_var + my_var3
print(output)

python 结束并出现以下错误。

**File "C:/path/to/my/file/testing_file.py", line 5, in <module>
    output = my_var + my_var3
TypeError: Can't convert 'bytes' object to str implicitly
Process finished with exit code 1**

我想知道这段代码有什么作用?这个逻辑正在另一个开发人员的另一个项目上实现,我根本无法理解。

我该如何解决这个问题?我需要一个字符串,之后我将对其进行操作。

【问题讨论】:

  • 请适当标记,我假设这是python 2.x?顺便说一句,规范化所做的是将可以由多个字节模式表示的字符转换为标准字节表示,例如西班牙语的变形 ñ 可以是 U+00F1 或正则 n 后跟 U+0303。规范化将后者的所有实例转换为前者。
  • 这是在带有 python 2.7 的 Jenkins Slave 上运行的。
  • 但是,现在我的脚本已经启动并运行了。也谢谢你的解释,对我很有帮助。
  • 不用担心。我为未来的读者添加了 python2.7 标签。很高兴这个解释很有帮助,我曾经花费大量时间来追踪与非规范化 unicode 内容相关的应用程序中的错误。

标签: python python-2.7 ascii typeerror


【解决方案1】:

您需要指定编码类型。

那么你需要使用 unicode 而不是 string 作为 normalize() 的参数

# -*- coding: utf-8 -*-

import unicodedata
my_var = u"this is a string"
my_var2 = u" Esta es una oración que está en español "
my_var3 = unicodedata.normalize(u'NFKD', my_var2).encode('ascii', 'ignore').decode('utf8')
output = my_var + my_var3
print(output)

【讨论】:

  • Python 版本?
  • 我编辑代码:你应该在规范化后解码字符串
  • 用 python 2.7 和 python3 测试
  • 感谢您的时间和帮助。我不知道为什么,但 PyCharm 没有显示解码方法。它现在正在工作。再次感谢。
【解决方案2】:

在 Python 3 中,string.encode() 创建一个字节字符串,它不能与常规字符串混合。您必须再次将结果转换回字符串;该方法可以预见地称为decode

my_var3 = unicodedata.normalize('NFKD', my_var2).encode('ascii', 'ignore').decode('ascii')

在 Python 2 中,Unicode 字符串和“常规”(字节)字符串之间没有硬性区别,但这意味着当程序员对他们正在操作的字符串的编码进行粗心假设时,就会引入许多难以捕捉的错误。

至于规范化的作用,它确保看起来相同的字符实际上是相同的。例如,ñ 可以表示为单个代码点 U+00F1 LATIN SMALL LETTER N WITH TILDE 或组合序列 U+006E LATIN SMALL LETTER N 后跟 U+0303 COMBINING TILDE。 规范化将这些转换,以便每个变化都被强制转换为相同的表示形式(D 规范化更喜欢分解的组合序列),以便表示同样的文本也保证包含完全相同的代码点。

因为在许多基于拉丁语的语言中,分解的字符通常是一个纯 ASCII 字符序列,后跟许多不是传统 ASCII 字符的组合变音符号,因此使用 'ignore' 错误处理程序将字符串转换为 7 位 ASCII通常会去除重音符号,但使文本几乎可读。 Götterdämmerung 被转换为 Gotterdammerung 等。

【讨论】:

  • 你的解释很清楚,现在我想我可以将 付诸实践,我认为这是一个非常强大的方法。谢谢!
  • 它对葡萄牙语非常有效——这种方式由上面的@tripleee 定义。谢谢!点赞:unicodedata.normalize('NFKD', 'José João Caminhão Cachaçaria Pêssegó').encode('ascii', 'ignore').decode('utf8').upper() 输出:JOSE JOAO CAMINHAO CACHACARIA PESSEGO
猜你喜欢
  • 2020-10-13
  • 2018-12-04
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2011-06-18
  • 2020-05-23
  • 2020-03-19
相关资源
最近更新 更多