Вопрос

В python строки могут быть юникодными (как utf-16, так и utf-8) и однобайтовыми с разными кодировками (cp1251, cp1252 и т.д.).Можно ли проверить, что такое строка кодировки?Например,

time.strftime( "%b" )

вернет строку с текстовым названием месяца.В macOS возвращаемая строка будет utf-16, в Windows с английским local она будет однобайтовой в кодировке ascii, а в Windows с неанглоязычной локализацией она будет закодирована через кодовую страницу локали, например cp1251.Как я могу обрабатывать такие строки?

Это было полезно?

Решение

Строки не хранят никакой информации о кодировке, вам просто нужно указать ее при преобразовании в / из unicode или печати на устройстве вывода :

import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)

UTF-8 - это нет юникод, это кодировка юникода в однобайтовые строки.

Лучшая практика - работать с unicode везде на стороне python, хранить ваши строки в обратимой кодировке unicode, такой как UTF-8, и преобразовывать в необычные локали только для пользовательского вывода.

Другие советы

определение кодировки кодировки очень сложно.

однако, какова ваша реальная цель для этого?если вы просто хотите, чтобы значение было в юникоде, просто напишите

unicode(time.strftime("%b"))

и это должно сработать для всех случаев, о которых вы упомянули выше:

  • mac os:юникод (unicode) -> юникод
  • победа/англ:unicode(ascii) -> юникод
  • победа/ноненг:unicode(some_cp) -> будет преобразован локальным cp -> unicode

Если у вас есть достаточно длинная строка в неизвестной кодировке, вы можете попытаться угадать кодировку, напримерс Универсальным детектором кодирования на https://github.com/dcramer/chardet -- конечно, не надежно, но иногда угадывает правильно;-).Но это не очень поможет с очень короткими строками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top