Если вы управляете бэкэнд и используете 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 конечно)
def utf8len(s):
return len(s.encode('utf-8'))
Отлично работает в Python 2 и 3.
Используйте метод string '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)