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

如何确定Python中utf-8编码字符串的字节长度?,python,unicode,utf-8,Python,Unicode,Utf 8,我正在使用AmazonS3上传,但由于密钥名太长,我遇到了麻烦。S3将密钥的长度限制为字节,而不是字符 从文档中: 密钥的名称是一个Unicode字符序列,其UTF-8编码长度最多为1024字节 我还尝试在文件名中嵌入元数据,因此我需要能够使用Python计算字符串的当前字节长度,以确保元数据不会使键太长(在这种情况下,我必须使用单独的元数据文件) 如何确定utf-8编码字符串的字节长度?再说一次,我对字符长度不感兴趣。。。而是用于存储字符串的实际字节长度 def utf8len(s):

我正在使用AmazonS3上传,但由于密钥名太长,我遇到了麻烦。S3将密钥的长度限制为字节,而不是字符

从文档中:

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

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

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

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

在Python 2和3中工作正常。

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

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

对字符串进行编码并在结果上使用
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)
def utf8\u char\u len\u 1(c):
代码点=ord(c)

如果是代码点,谢谢。我还发现了一个网站,它用几种语言向您展示了如何使用它:请不要使用
str
作为变量名!这将导致无尽的悲痛。请注意,作为不复制的交换,这大约需要180倍的时间,只要
len(s.encode('utf-8'))
,至少在我的python 3.3.2上是1000个utf8字符的字符串。(如果你用C语言编写同样的算法,速度可能会相当。)@Dougal,谢谢你运行这个测试。这是有用的信息,对于评估可能的解决方案至关重要。我有一种感觉,它可能会慢一些,但不知道它的大小。两个版本都试过了吗?带有
utf8\u字符长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度长度。当然,我们所说的每种情况下都不到一毫秒,所以如果你只做几次,那根本不重要:2µs/375µs/600µs。也就是说,复制1kb内存也不太重要。:)