unicodedata.normalize在python中做什么?

时间:2018-08-06 14:36:28

标签: python python-2.7 ascii typeerror

我有以下代码:

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

我想知道这段代码做什么?这个逻辑正在另一个开发人员的另一个项目上实现,我完全不理解。

如何解决此问题?我需要一个字符串,以后将对其进行处理。

2 个答案:

答案 0 :(得分:5)

您需要指定编码类型。

然后您需要使用unicode而不是字符串作为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)

答案 1 :(得分:2)

在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 ,后跟U+0303 合并标题。归一化将其转换为每个变体都被强制转换为相同的表示形式(D归一化更喜欢分解的合并序列)这样代表相同文本的字符串也可以保证包含完全相同的代码点。

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