我有不同语言的不同文本的语料库
我想捕捉所有角色。我使用 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转义字符序列中的小写不是这种情况。我试过了两个,结果是一样的。
答案 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