返回unicode字符串的前N个字符

时间:2010-01-28 10:56:23

标签: python unicode python-2.x

我在unicode中有一个字符串,我需要返回前N个字符。 我这样做:

result = unistring[:5]

但当然是unicode字符串的长度!=字符长度。 有任何想法吗?唯一的解决方案是使用re?

修改:更多信息

unistring = "Μεταλλικα" #Metallica written in Greek letters
result = unistring[:1]

returns-> ?

我认为unicode字符串是两个字节(char),这就是为什么会发生这种情况。如果我这样做:

result = unistring[:2]

我得到了

M

这是正确的, 那么,我应该总是切片* 2还是应该转换成什么?

3 个答案:

答案 0 :(得分:7)

当你说:

unistring = "Μεταλλικα" #Metallica written in Greek letters

没有一个unicode字符串。你有一个字节串(大概)UTF-8。那不是一回事。 unicode字符串是Python中的一个单独的数据类型。通过使用正确的编码解码字节串来获得unicode:

unistring = "Μεταλλικα".decode('utf-8')

或使用具有正确编码声明的源文件中的unicode文字

# coding: UTF-8
unistring = u"Μεταλλικα"

执行unistring[:5]时,unicode字符串将执行您想要的操作。

答案 1 :(得分:6)

不幸的是,由于Python 3.0之前的历史原因,有两种字符串类型。 byte strings (str) and Unicode strings (unicode)

在Python 3.0中统一之前,有两种方法可以声明字符串文字:unistring = "Μεταλλικα"是一个字节字符串,而unistring = u"Μεταλλικα"是一个unicode字符串。

执行?时看到result = unistring[:1]的原因是因为Unicode文本中的某些字符无法在非unicode字符串中正确表示。如果你曾经使用过非常古老的电子邮件客户端并收到希腊等国家的朋友发来的电子邮件,你可能已经看到过这种问题。

因此,在Python 2.x中,如果需要处理Unicode,则必须明确地执行此操作。看一下在Python中处理Unicode的介绍:Unicode HOWTO

答案 2 :(得分:4)

任何类型的“Unicode字符串”都没有正确的直接方法。

即使Python“Unicode”UTF-16字符串也有可变长度的字符,所以你不能只用ustring [:5]剪切。因为某些Unicode代码点可能使用多个“字符”,即代理对。

因此,如果您想削减5个代码点(请注意这些字符),以便分析文字,请参阅http://en.wikipedia.org/wiki/UTF-8和{{3定义。因此,您需要使用一些位掩码来确定边界。

此外,你仍然没有得到角色。因为例如。单词“שָלוֹם” - 希伯来语中的和平“Shalom”由4个字符和6个代码点组成,字母“shin”,元音“a”字母“lamed”,字母“vav”和元音“o”以及最后一个字母“mem”。

所以字符不是代码点

对于大多数西方语言也是如此,其中带有变音符号的字母可以表示为两个代码点。搜索“unicode normalization”的示例。

所以...如果你真的需要5个第一个字符,你必须使用像ICU库这样的工具。例如,有用于Python的ICU库,它提供了字符边界迭代器。