Как определить длину байта строки в кодировке utf-8 в Python?

Если вы управляете бэкэнд и используете django, 4-строчная реализация идеи Дэна:

def get_browser_lang(request):
if request.META.has_key('HTTP_ACCEPT_LANGUAGE'):
    return JsonResponse({'response': request.META['HTTP_ACCEPT_LANGUAGE']})
else:
    return JsonResponse({'response': settings.DEFAULT_LANG})

, а затем в urls.py:

url(r'^browserlang/$', views.get_browser_lang, name='get_browser_lang'),

и на переднем конце:

$.get(lg('SERVER') + 'browserlang/', function(data){
    var lang_code = data.response.split(',')[0].split(';')[0].split('-')[0];
});

(вы должны установить DEFAULT_LANG в settings.py конечно)

23
задан Nakilon 23 September 2013 в 15:52
поделиться

3 ответа

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

Отлично работает в Python 2 и 3.

36
ответ дан Dietrich Epp 23 September 2013 в 15:52
поделиться

Используйте метод string 'encode' для преобразования строки символов в строку байтов, затем используйте len () как обычно:

>>> s = u"¡Hola, mundo!"                                                      
>>> len(s)                                                                    
13 # characters                                                                             
>>> len(s.encode('utf-8'))   
14 # bytes
8
ответ дан Mark Reed 23 September 2013 в 15:52
поделиться

Кодирование строки и использование 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)
4
ответ дан Mark Ransom 23 September 2013 в 15:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: