如何在Python中确定utf-8编码字符串的字节长度?

时间:2011-07-16 02:10:34

标签: python unicode utf-8

我正在使用Amazon S3上传,但是因为密钥名称太长而无法解决问题。 S3按字节限制密钥的长度,而不是字符。

来自文档:

  

密钥的名称是一系列Unicode字符,其UTF-8编码长度最多为1024个字节。

我还尝试在文件名中嵌入元数据,因此我需要能够使用Python计算字符串的当前字节长度,以确保元数据不会使密钥太长(在这种情况下我会有使用单独的元数据文件。)

如何确定utf-8编码字符串的字节长度?同样,我对字符长度感兴趣...而不是用于存储字符串的实际字节长度。

3 个答案:

答案 0 :(得分:36)

def utf8len(s):
    return len(s.encode('utf-8'))

在Python 2和3中正常工作。

答案 1 :(得分:8)

使用字符串'encode'方法将字符串转换为字节字符串,然后像正常一样使用len():

>>> s = u"¡Hola, mundo!"                                                      
>>> len(s)                                                                    
13 # characters                                                                             
>>> len(s.encode('utf-8'))   
14 # bytes

答案 2 :(得分:4)

编码字符串并在结果上使用len非常有效,正如其他答案所示。它确实需要构建一个字符串的丢弃副本 - 如果你使用非常大的字符串,这可能不是最佳的(我不认为1024字节是)。 UTF-8的结构允许您非常轻松地获取每个字符的长度,甚至不需要对其进行编码,尽管编码单个字符可能仍然更容易。我在这里介绍两种方法,它们应该给出相同的结果。

def utf8_char_len_1(c):
    codepoint = ord(c)
    if codepoint <= 0x7f:
        return 1
    if codepoint <= 0x7ff:
        return 2
    if codepoint <= 0xffff:
        return 3
    if codepoint <= 0x10ffff:
        return 4
    raise ValueError('Invalid Unicode character: ' + hex(codepoint))

def utf8_char_len_2(c):
    return len(c.encode('utf-8'))

utf8_char_len = utf8_char_len_1

def utf8len(s):
    return sum(utf8_char_len(c) for c in s)