python-将字符串转换为unicode字符串

时间:2018-07-30 11:32:31

标签: python python-2.7 unicode utf

我使用库unidecode将带重音符号的字符串转换为以ascii表示的字母。

>>> accented_string = u'Málaga'
# accented_string is of type 'unicode'
>>> import unidecode
>>> unidecode.unidecode(accented_string)
>>> Malaga

但是问题是我正在从文件中读取字符串,如何将其发送到'unidecode'库。

for name in strings:
   print unidecode.unidecode(u+name) #?????

我无法解决这个问题?如果我对它进行编码,只会给我错误的编码。

3 个答案:

答案 0 :(得分:1)

我们仍然不知道您的pandas列的类型,因此这是Python 2的两个版本:

  • 如果strings已经是Unicode字符串序列(type(name)unicode):

    for name in strings:
        print unidecode.unidecode(name)
    
  • 如果strings的元素是常规Python 2 strtype(name)str):

    for name in strings:
        print unidecode.unidecode(name.decode("utf-8"))
    

如果您的字符串以UTF-8编码存储,这将起作用。否则,您将必须提供适当的编码,例如"latin-1"

在Python 3中,第一个版本应该可以运行;您必须先解决编码问题,然后才能开始操作,即,当您第一次从磁盘读取数据时。

答案 1 :(得分:1)

我有一个解决方法,它太简单了,只需将读取的字符串解码回unicode字符串,然后将其传递给“ unidecode”库即可。

>>> accented_string = 'Málaga'
>>> accented_string_u = accented_string.decode('utf-8')
>>> import unidecode
>>> unidecode.unidecode(accented_string_u)
>>> Malaga

答案 2 :(得分:0)

使用unicodedata.normalize

accented_string = u"Málaga"
unicodedata.normalize( "NFKD", accented_string ).encode( "ascii", "ignore" )

您可以使用4种规范化形式:“ NFC”,“ NFKC”,“ NFD”和“ NFKD”。

以下是上面链接的文档中使用它的详细信息:

Unicode标准基于规范对等和兼容性对等的定义,定义了Unicode字符串的各种规范化形式。在Unicode中,可以用各种方式表示几个字符。例如,字符U + 00C7(带有CEDILLA的拉丁文大写字母C)也可以表示为序列U + 0043(拉丁文的大写字母C)U + 0327(合并CEDILLA)。

对于每个字符,有两种规范形式:规范形式C和规范形式D。规范形式D(NFD)也称为规范分解,将每个字符转换为其分解形式。普通形式C(NFC)首先应用规范分解,然后再次组成预组合字符。

除了这两种形式,还有两种基于兼容性对等的普通形式。在Unicode中,支持某些字符,这些字符通常会与其他字符统一。例如,U + 2160(罗马数字ONE)与U + 0049(拉丁大写字母I)实际上是同一回事。但是,Unicode支持它以与现有字符集(例如gb2312)兼容。

正常形式的KD(NFKD)将应用兼容性分解,即以所有等效字符替换它们的等效字符。范式KC(NFKC)首先应用兼容性分解,然后进行规范组合。

即使对两个unicode字符串进行了归一化处理并使其与人类阅读器看起来相同,即使其中一个具有组合字符,而另一个却没有,则它们可能不相等。