【问题标题】:How to capture all letters from different languages in python?如何在python中捕获来自不同语言的所有字母?
【发布时间】:2016-09-09 16:52:31
【问题描述】:

我有一个来自不同语言的不同文本的语料库。
我想捕捉所有角色。我使用 python 2.7 并且 defaultencodingsettingutf-8
我不知道为什么当我将此代码用于德语变音符号时,它会正确打印出德语变音符号:

'Erd\xC3\xA4pfel'.decode('unicode-escape').encode('latin1').decode('utf-8')    

结果是: Erdäpfel

但是当我使用这段代码时:

'Erd\xC3\xA4pfel'.decode('unicode-escape').encode('utf-8').decode('utf-8')

结果是: Erdäpfel 这是不同的。

我不熟悉文本挖掘。我知道例如 latin1 编码不包含我的项目中不需要的法语字母。 如何将我的语料库中的所有 unicode 转义字符串转换为相应的字符,而不管它们的语言如何?

Utf-8 根据文档包含所有语言,但为什么它不能正确打印出德语变音符号而 latin1 编码正确打印出来?

PS:unicode 转义字符序列中的小写字母不是这种情况。我都试过了,结果是一样的。

【问题讨论】:

  • 'Erd\xC3\xA4pfel'已经 UTF-8,解码为unicode-escape与解码为Latin-1基本相同..
  • 你能解释一下吗?

标签: python unicode


【解决方案1】:

已经拥有 UTF-8 编码的数据。在您的字节串中没有要转义的字符串文字字符。您正在查看字符串的 repr() 输出,其中不可打印的 ASCII 字符显示为转义序列,因为这使得该值可以轻松地以 ASCII 安全的方式复制粘贴。您看到的\xc3一个字节,而不是单独的字符:

>>> 'Erd\xC3\xA4pfel'
'Erd\xc3\xa4pfel'
>>> 'Erd\xC3\xA4pfel'[3]
'\xc3'
>>> 'Erd\xC3\xA4pfel'[4]
'\xa4'
>>> print 'Erd\xC3\xA4pfel'
Erdäpfel

您必须使用原始字符串文字或双反斜杠才能真正获得unicode-escape 可以处理的转义序列:

>>> '\\xc3\\xa4'
'\\xc3\\xa4'
>>> '\\xc3\\xa4'[0]
'\\'
>>> '\\xc3\\xa4'[1]
'x'
>>> '\\xc3\\xa4'[2]
'c'
>>> '\\xc3\\xa4'[3]
'3'
>>> print '\\xc3\\xa4'
\xc3\xa4

注意该字符串中如何有一个单独的\ 反斜杠字符(回显为\\,再次转义)。

在解释实际转义序列之后,unicode-escape 将您的数据解码为 Latin-1,因此您最终会得到一个包含字符 U+00C3 LATIN CAPITAL LETTER A WITH TILDE 的 Unicode 字符串。将其编码回 Latin-1 字节会再次为您提供 \xC3 字节,然后您将返回 UTF-8 字节。然后解码为 UTF-8 正常工作。

但您的第二次尝试将带有 TILDE 代码点的 U+00C3 拉丁大写字母 A 编码为 UTF-8,而 编码为您提供了字节序列 \xc3\x83。将这些字节打印到 UTF-8 终端将显示 Ã 字符。另一个字节\xA4 变成了U+00A4 CURRENCY SIGN,其UTF-8 字节序列为\xc2\xa4,打印为¤

这里完全不需要解码为unicode-escape。让数据保持原样。或者,也许,解码为 UTF-8 以获得 unicode 对象:

>>> 'Erd\xC3\xA4pfel'.decode('utf8')
u'Erd\xe4pfel'
>>> print 'Erd\xC3\xA4pfel'.decode('utf8')
Erdäpfel

如果您的实际数据(而不是您所做的测试)包含编码 UTTF-8 的\xhh 转义序列,则不要使用unicode-escape 解码这些序列 。使用string-escape,这样您就可以得到一个包含 UTF-8 数据的字节字符串(然后您可以根据需要将其解码为 Unicode):

>>> 'Erd\\xc3\\xa4pfel'
'Erd\\xc3\\xa4pfel'
>>> 'Erd\\xc3\\xa4pfel'.decode('string-escape')
'Erd\xc3\xa4pfel'
>>> 'Erd\\xc3\\xa4pfel'.decode('string-escape').decode('utf8')
u'Erd\xe4pfel'
>>> print 'Erd\\xc3\\xa4pfel'.decode('string-escape').decode('utf8')
Erdäpfel

【讨论】:

  • 感谢您的精彩解释。它可以在没有解码 unicode 转义的情况下工作,它可以捕获许多不同的字母,但例如我有这样一个字符串 \xedcies,informaci\xf3,v\xeddeos,fotos,\xe0udios,gr\xe0fics 这是什么?
  • @Kaggle:我不知道;信息太少了,无法继续。该字符串如何显示?是repr() 回声吗? (当您在交互式解释器中回显一个值或打印一个容器时,您会看到repr() 输出)。如果是这样,该表示是否以u 开头? Python 2 将始终仅以此类字符串表示形式显示 ASCII 可打印字符,其他所有内容都将使用转义序列(直到 U+00FF Unicode,你会得到 \xhh 序列,之后你会得到 \uhhhh\Uhhhhhhhh)。
  • @Kaggle:我怀疑您正在查看unicode 字符串表示(u'...'),此时看到\xed\xf3正常;您看到的是 Latin-1 字符;打印该字符串,您将看到ícies,informació,vídeos,fotos,àudios,gràfics 输出。
  • 我只是简单地打印它。它不以 u 开头。
  • @Kaggle:那么print repr(value) 产生了什么?双反斜杠?因为那时您实际上 确实 在该数据中具有文字转义序列。在这种情况下,该数据似乎是 Latin-1 编码的。
猜你喜欢
  • 1970-01-01
  • 2020-07-25
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
相关资源
最近更新 更多