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

python - conversion of a string to a unicode string

我正在使用库 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) #?????

我无法理解它?如果我对它进行编码,只会给我错误的编码。

使用 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 WITH CEDILLA)也可以表示为序列 U+0043(拉丁文大写字母 C)U+0327(COMBINING CEDILLA)。

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

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

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

即使两个 unicode 字符串被规范化并且对人类来说看起来相同 reader,如果一个有组合字符而另一个没有,它们可能不相等。

我们仍然不知道您的 pandas 专栏的类型,因此这里有 Python 2 的两个版本:

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

    for name in strings:
        print unidecode.unidecode(name)
    
  • 如果strings的元素是正则Python2strtype(name)str):

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

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

在Python3中,第一个版本应该可以;在你到达这一点之前,你必须解决你的编码问题,即当你第一次从磁盘读取数据时。

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

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