我有一个由不同语言的不同文本组成的语料库。
\n我想捕获所有字符。我使用python 2.7,默认编码设置是utf-8。
\n我不知道为什么当我使用此代码作为德语变音符号时,它会正确打印出德语变音符号:
'Erd\\xC3\\xA4pfel'.decode('unicode-escape').encode('latin1').decode('utf-8') \nRun 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')\nRun Code Online (Sandbox Code Playgroud)\n\n结果是:\n Erd\xc3\x83\xc2\xa4pfel这是不同的。
\n\n我不熟悉文本挖掘。我知道例如 latin1 编码不包含法文字母,这在我的项目中是不需要的。\n如何将我的语料库中的所有 unicode 转义字符串(无论其语言如何)转换为相应的字符?
\n\nUTF-8根据文档,
\n\nPS:unicode转义字符序列中的小写字母并非如此。我都尝试过,结果是一样的。
\n您已经拥有 UTF-8 编码的数据。字节串中没有要转义的字符串文字字符。您正在查看repr()一个字符串的输出,其中不可打印的 ASCII 字符显示为转义序列,因为这使得该值可以轻松地以 ASCII 安全的方式复制粘贴。你\\xc3看到的是一个字节,而不是单独的字符:
>>> \'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\nRun Code Online (Sandbox Code Playgroud)\n\n您必须使用原始字符串文字或双反斜杠才能实际获得转义序列unicode-escape可以处理的转义序列:
>>> \'\\\\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\nRun Code Online (Sandbox Code Playgroud)\n\n\\请注意该字符串中如何有一个单独的反斜杠字符(回显为\\\\,再次转义)。
接下来解释实际的转义序列,他将您的数据解码为 Latin-1,因此您最终会得到一个 Unicode 字符串,其中unicode-escape包含字符U+00C3 LATIN CAPITAL LETTER A with TILDE 。将其编码回 Latin-1 字节会\\xC3再次提供该字节,并且您将返回到 UTF-8 字节。然后解码为 UTF-8 即可正常工作。
但是您的第二次尝试将 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。
完全不需要像这里一样解码unicode-escape。只需保留数据即可。或者,也许解码为 UTF-8 以获取对象unicode:
>>> \'Erd\\xC3\\xA4pfel\'.decode(\'utf8\')\nu\'Erd\\xe4pfel\'\n>>> print \'Erd\\xC3\\xA4pfel\'.decode(\'utf8\')\nErd\xc3\xa4pfel\nRun Code Online (Sandbox Code Playgroud)\n\n如果您的实际数据(而不是您所做的测试)包含编码 UTTF-8 的转义序列,则也\\xhh不要用于unicode-escape解码这些序列。使用string-escape这样您可以获得包含 UTF-8 数据的字节字符串(然后您可以根据需要将其解码为 Unicode):
>>> \'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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2840 次 |
| 最近记录: |