【问题标题】:python - conversion of a string to a unicode stringpython - 将字符串转换为 unicode 字符串
【发布时间】:2018-07-30 11:32:31
【问题描述】:

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

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

【问题讨论】:

  • strings 阅读怎么样?
  • 从 csv 文件到 panda 数据框,然后遍历每个字符串值,每个字符串值的类型都是“字符串”。
  • 请在您的问题中也包含该代码。
  • 忽略您在示例中看到的“u”;它只是 Python 2 表示法告诉你它是 unicode。如果您的字符串还不是 unicode,您需要知道它们的编码并将它们从 str 转换为 unicode。
  • 如果这不是大型现有程序的一部分,我强烈建议您立即安装 Python 3 并开始使用它。在 2018 年试图弄清楚 Python 2 的字符编码方法是一种自虐练习。

标签: python python-2.7 unicode utf


【解决方案1】:

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

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

【讨论】:

  • 您没有将其“回”解码为 un​​icode,而是第一次在 Python 中对其进行解码。
【解决方案2】:

我们仍然不知道您的 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 中,第一个版本应该可以工作;在你到达这一点之前,你必须解决你的编码问题,即当你第一次从磁盘读取数据时。

【讨论】:

    【解决方案3】:

    使用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 (LATIN CAPITAL LETTER C WITH CEDILLA) 也可以表示为序列 U+0043 (LATIN CAPITAL LETTER C) U+0327 (COMBINING CEDILLA)。

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

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

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

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

    【讨论】:

    • 这与unidecode 库不同,例如。对于像“ç”或“ø”这样的字母。
    • 无论如何,我认为 OP 无法从文件中解码输入。我不明白你为什么提出一种不同的(可能是次等的)“重音剥离”方法。 unidecode 工作得非常好,如果你想要的只是一个 ASCII 表示。
    • 这是一种对我有用的类似问题的方法,所以我提到了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多