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

python—将字符串转换为unicode字符串,python,python-2.7,unicode,utf,Python,Python 2.7,Unicode,Utf,Im使用库unidecode将重音字符串转换为ascii表示的字符串 >>> accented_string = u'Málaga' # accented_string is of type 'unicode' >>> import unidecode >>> unidecode.unidecode(accented_string) >>> Malaga 但问题是我正在从文件中读取字符串,如何将其发送到“unidecode

Im使用库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) #?????
>>> accented_string = 'Málaga'
>>> accented_string_u = accented_string.decode('utf-8')
>>> import unidecode
>>> unidecode.unidecode(accented_string_u)
>>> Malaga
我的脑袋绕不过去了?如果我对它进行了编码,那只会给我错误的编码。

使用:

您可以使用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(罗马数字1)与U+0049(拉丁文大写字母I)实际上是相同的。但是,Unicode支持它与现有字符集(例如gb2312)兼容

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

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

使用:

您可以使用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(罗马数字1)与U+0049(拉丁文大写字母I)实际上是相同的。但是,Unicode支持它与现有字符集(例如gb2312)兼容

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


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

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

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

  • 如果
    字符串
    的元素是常规Python 2
    str
    type(name)
    str
    ):

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


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

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

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

  • 如果
    字符串
    的元素是常规Python 2
    str
    type(name)
    str
    ):

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


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

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

for name in strings:
   print unidecode.unidecode(u+name) #?????
>>> accented_string = 'Málaga'
>>> accented_string_u = accented_string.decode('utf-8')
>>> import unidecode
>>> unidecode.unidecode(accented_string_u)
>>> Malaga

我有一项工作太简单了,只需将读取的字符串解码回unicode字符串,然后将其传递到“unidecode”库

for name in strings:
   print unidecode.unidecode(u+name) #?????
>>> accented_string = 'Málaga'
>>> accented_string_u = accented_string.decode('utf-8')
>>> import unidecode
>>> unidecode.unidecode(accented_string_u)
>>> Malaga

如何从csv文件中读取
字符串
?然后在每个字符串值上循环,每个值的类型为“string”。请在问题中也包含该代码。忽略示例中的“u”;这只是Python2符号,告诉你它是unicode。如果您的字符串还不是unicode,您需要知道它们的编码,并将它们从
str
转换为unicode