unicodedata.normalize在python中的作用是什么?

13 人关注

我有以下代码。

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**

我想知道这段代码是做什么的?这个逻辑在另一个项目中被另一个开发者实现了,我完全不能理解它。

我怎样才能解决这个问题呢?我需要一个字符串,我将在之后进行操作。

4 个评论
请贴上适当的标签,我想这是Python 2.x吧?BTW 正常化的作用是将可以用多个字节模式表示的字符转换为标准的字节表示,例如,西班牙语的转折词ñ可以是U+00F1,也可以是U+0303后面的普通n。正常化将后者的所有实例转换为前者。
这是在Jenkins Slave上运行,使用python 2.7。
不过,现在我的脚本已经启动并运行了。我也感谢你的解释,对我很有帮助。
不用担心。我为未来的读者添加了python2.7的标签。很高兴这个解释对你有帮助,我曾经在一个应用程序中花了大量令人尴尬的时间来追踪一个与未规范化的unicode内容有关的错误。
python
python-2.7
ascii
typeerror
Javier Ramirez
Javier Ramirez
发布于 2018-08-06
2 个回答
tripleee
tripleee
发布于 2018-08-06
已采纳
0 人赞同

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

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

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

至于规范化的作用,它确保了看起来相同的字符实际上是相同的。比如说。ñ可以表示为单一代码点U+00F1 拉丁文小字N,带蒂尔德或作为组合序列U+006E 拉丁文小字N followed by U+0303 COMBINING TILDE.归一化对这些进行了转换,使每一个变体都被胁迫为相同的表示方式(D归一化更倾向于分解、组合的序列),因此代表相同文本的字符串也被保证包含完全相同的代码点。

由于许多基于拉丁语系的语言中的分解字符通常是一个普通ASCII字符的序列,后面是一些组合的变音符,而这些变音符不是传统的ASCII字符,用'ignore'错误处理程序将字符串转换为7位ASCII,通常会剥离重音符,但使文本几乎可读。Götterdämmerung gets converted to 破坏行为 etc.

Your explanation was very clear, now I think I'm able to put in practice <normalize> which I consider is a quite powerful method. Thank you!
这对葡萄牙人来说是完美的--方法是由上面的@tripleee定义的。谢谢! 喜欢。 【替换代码0 输出。 【替换代码1
Andrea
Andrea
发布于 2018-08-06
0 人赞同

You need to specify the encoding type.

那么你需要使用unicode而不是字符串作为normalize()的参数。

# -*- coding: utf-8 -*-
import unicodedata
my_var = u"this is a string"