代码之家  ›  专栏  ›  技术社区  ›  Jon Romero

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

  •  10
  • Jon Romero  · 技术社区  · 15 年前

    我有一个Unicode字符串,需要返回前n个字符。 我这样做:

    result = unistring[:5]
    

    当然是Unicode字符串的长度!=字符长度。 有什么想法吗?唯一的解决方案是使用Re?

    编辑:更多信息

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

    返回&?

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

    result = unistring[:2]
    

    我得到

    M

    这是正确的, 那么,我应该一直切2还是应该转换成别的?

    3 回复  |  直到 7 年前
        1
  •  6
  •   LennyLip    7 年前

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

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

    你看到的原因 ? 当你这样做的时候 result = unistring[:1] 是因为Unicode文本中的某些字符无法在非Unicode字符串中正确表示。例如,如果你曾经使用过一个非常老的电子邮件客户端,并且收到过希腊等国朋友的电子邮件,那么你可能已经看到了这种问题。

    所以在python 2.x中,如果需要处理unicode,就必须显式处理。请看一下在python中处理unicode的介绍: Unicode HOWTO

        2
  •  7
  •   Thomas Wouters    15 年前

    当你说:

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

    没有 Unicode字符串。您有一个以(大概)UTF-8为单位的字节字符串。这不是同一件事。Unicode字符串是Python中单独的数据类型。通过使用正确的编码对字节串进行解码,可以获得Unicode:

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

    或者在具有正确编码声明的源文件中使用Unicode文本

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

    Unicode字符串将在执行此操作时执行所需的操作。 unistring[:5] .

        3
  •  4
  •   Tomer Cohen    12 年前

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

    即使是python的“unicode”utf-16字符串也有可变长度的字符,因此,不能只使用ustring[:5]进行剪切。因为某些Unicode代码点可能使用多个“字符”,即代理项对。

    所以如果你想切5个 代码点 (注意这些不是 文字 )因此,您可以分析文本,请参见 http://en.wikipedia.org/wiki/UTF-8 http://en.wikipedia.org/wiki/UTF-16 定义。所以需要使用一些位掩码来计算边界。

    而且你仍然没有得到字符。比如说。单词“×_××_×”--希伯来语和平“shalom”由4个字符和6个码位字母“shin”、元音“a”字母“lamed”、字母“vav”和元音“o”以及最后一个字母“mem”组成。

    所以 性格