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

时间:2016-09-09 16:52:31

标签: python unicode

我有不同语言的不同文本的语料库 我想捕捉所有角色。我使用 python 2.7 默认设置 utf-8
我不知道为什么当我将这段代码用于德语变音符号时,它会正确打印出德语变音符号:

var foo = function* () {
  console.log('first call to next runs to yield #1');
  var a = yield 'A'; // this yield pushes 'A' and returns 'a'
  console.log('second call to next runs to yield #2');
  var b = yield 'B'; // this yield pushes 'B' and returns 'b'
  console.log('third call to next runs to the end of the generator ');
  // there's no return statement here so we are returning undefined
};

var f = foo();

console.log(f.next('this gets ignored')); // { value: 'A', done: false }
console.log(f.next('a'));                 // { value: 'B', done: false }
console.log(f.next('b'));                 // { value: undefined, done: true }

// any further call just returns whatever the last returned value was
console.log(f.next('this also gets ignored since we are done')); // { value: undefined, done: true }

结果是: Erdäpfel

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

已经拥有UTF-8编码数据。您的bytestring中没有要转义的字符串文字字符。您正在查看字符串的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 LATIN CAPITAL LETTER编码为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