字符串到unicode字符串的python转换

2024-10-04 01:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

Im使用库unidecode将重音符号字符串转换为ascii表示的符号。在

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

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

^{pr2}$

我不知道该怎么办?如果我给它编码,那就是给我错误的编码。在


Tags: of字符串import编码stringistypeascii
3条回答

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

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

使用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(带加符的拉丁文大写字母C)也可以表示为序列U+0043(拉丁文大写字母C)U+0327(组合加符)。在

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

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

标准格式KD(NFKD)将应用兼容性分解,即用它们的等价物替换所有兼容字符。范式KC(NFKC)首先应用相容性分解,然后应用正则组合。在

即使两个unicode字符串被规范化,在人类读者看来是一样的,如果一个有组合字符,而另一个没有,它们可能无法进行相等的比较。在

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

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

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

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

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

在python3中,第一个版本应该可以工作;在到达这一点之前,即第一次从磁盘读入数据时,必须先解决编码问题。在

相关问题 更多 >