如何在Python中捕获不同语言的所有字母?

Kag*_*gle 0 python unicode

我有一个由不同语言的不同文本组成的语料库。
\n我想捕获所有字符。我使用python 2.7默认编码设置utf-8
\n我不知道为什么当我使用此代码作为德语变音符号时,它会正确打印出德语变音符号:

\n\n
'Erd\\xC3\\xA4pfel'.decode('unicode-escape').encode('latin1').decode('utf-8')    \n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是:\n Erd\xc3\xa4pfel

\n\n

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

\n\n
'Erd\\xC3\\xA4pfel'.decode('unicode-escape').encode('utf-8').decode('utf-8')\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是:\n Erd\xc3\x83\xc2\xa4pfel这是不同的。

\n\n

我不熟悉文本挖掘。我知道例如 latin1 编码不包含法文字母,这在我的项目中是不需要的。\n如何将我的语料库中的所有 unicode 转义字符串(无论其语言如何)转换为相应的字符?

\n\n

UTF-8根据文档,

\n\n

PS:unicode转义字符序列中的小写字母并非如此。我都尝试过,结果是一样的。

\n

Mar*_*ers 5

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

\n\n
>>> \'Erd\\xC3\\xA4pfel\'\n\'Erd\\xc3\\xa4pfel\'\n>>> \'Erd\\xC3\\xA4pfel\'[3]\n\'\\xc3\'\n>>> \'Erd\\xC3\\xA4pfel\'[4]\n\'\\xa4\'\n>>> print \'Erd\\xC3\\xA4pfel\'\nErd\xc3\xa4pfel\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
>>> \'\\\\xc3\\\\xa4\'\n\'\\\\xc3\\\\xa4\'\n>>> \'\\\\xc3\\\\xa4\'[0]\n\'\\\\\'\n>>> \'\\\\xc3\\\\xa4\'[1]\n\'x\'\n>>> \'\\\\xc3\\\\xa4\'[2]\n\'c\'\n>>> \'\\\\xc3\\\\xa4\'[3]\n\'3\'\n>>> print \'\\\\xc3\\\\xa4\'\n\\xc3\\xa4\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

但是您的第二次尝试将 U+00C3 LATIN CAPITAL LETTER A WITH TILDE 代码点编码为 UTF-8,并且编码为您提供了字节序列\\xc3\\x83。将这些字节打印到 UTF-8 终端将显示该\xc3\x83字符。另一个字节\\xA4成为U+00A4 CURRENCY SIGN,其 UTF-8 字节序列为\\xc2\\xa4,打印为\xc2\xa4

\n\n

完全不需要像这里一样解码unicode-escape。只需保留数据即可。或者,也许解码为 UTF-8 以获取对象unicode

\n\n
>>> \'Erd\\xC3\\xA4pfel\'.decode(\'utf8\')\nu\'Erd\\xe4pfel\'\n>>> print \'Erd\\xC3\\xA4pfel\'.decode(\'utf8\')\nErd\xc3\xa4pfel\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
>>> \'Erd\\\\xc3\\\\xa4pfel\'\n\'Erd\\\\xc3\\\\xa4pfel\'\n>>> \'Erd\\\\xc3\\\\xa4pfel\'.decode(\'string-escape\')\n\'Erd\\xc3\\xa4pfel\'\n>>> \'Erd\\\\xc3\\\\xa4pfel\'.decode(\'string-escape\').decode(\'utf8\')\nu\'Erd\\xe4pfel\'\n>>> print \'Erd\\\\xc3\\\\xa4pfel\'.decode(\'string-escape\').decode(\'utf8\')\nErd\xc3\xa4pfel\n
Run Code Online (Sandbox Code Playgroud)\n