我正在使用Amazon S3上传,但是因为密钥名称太长而无法解决问题。 S3按字节限制密钥的长度,而不是字符。
来自文档:
密钥的名称是一系列Unicode字符,其UTF-8编码长度最多为1024个字节。
我还尝试在文件名中嵌入元数据,因此我需要能够使用Python计算字符串的当前字节长度,以确保元数据不会使密钥太长(在这种情况下我会有使用单独的元数据文件。)
如何确定utf-8编码字符串的字节长度?同样,我对字符长度感兴趣...而不是用于存储字符串的实际字节长度。
答案 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)