Jav*_*rez 3 python ascii typeerror python-2.7
我有以下代码:
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)
Run Code Online (Sandbox Code Playgroud)
并且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**
Run Code Online (Sandbox Code Playgroud)
我想知道这段代码做什么?这个逻辑正在另一个开发人员的另一个项目上实现,我完全不理解。
我怎么解决这个问题?我需要一个字符串,稍后将对其进行操作。
在Python 3中,string.encode()创建一个字节字符串,该字符串不能与常规字符串混合。您必须再次将结果转换回字符串。该方法可预测地称为decode。
my_var3 = unicodedata.normalize('NFKD', my_var2).encode('ascii', 'ignore').decode('ascii')
Run Code Online (Sandbox Code Playgroud)
在Python 2中,在Unicode字符串和“常规”(字节)字符串之间没有硬性区别,但这意味着当程序员对所操纵的字符串的编码有粗心大意的假设时,会引入许多难以捕获的错误。
至于归一化的功能,它可以确保看起来相同的字符实际上是相同的。例如,ñ可以表示为单个代码点U + 00F1带 小写字母的拉丁文小写字母N,也可以表示为紧跟着U + 0303 组合小写字母N的组合序列U + 006E 拉丁文小写字母N。归一化将它们转换为每个变体都被强制转换为相同的表示形式(D归一化更喜欢分解的组合序列),从而保证表示相同文本的字符串也包含完全相同的代码点。
因为在许多基于拉丁语的语言中,分解后的字符通常是一个纯ASCII字符序列,后面是许多组合变音符号,这些字符不是旧版ASCII字符,所以使用'ignore'错误处理程序将字符串转换为7位ASCII 通常会去除重音但留下文字几乎可读。Götterdämmerung被转换成Gotterdammerung等。
您需要指定编码类型。
然后,您需要使用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)
Run Code Online (Sandbox Code Playgroud)