Question

En python, les chaînes peuvent être unicode (à la fois utf-16 et utf-8) et à un octet avec des codages différents (cp1251, cp1252, etc.). Est-il possible de vérifier quelle chaîne d'encodage est? Par exemple,

time.strftime( "%b" )

renverra une chaîne avec le nom de texte d'un mois. Sous MacOS, la chaîne renvoyée sera utf-16, sous Windows avec l'anglais local, le codage sur un octet est codé sur un octet, et sous Windows avec l'environnement local non anglais, elle sera encodée via la page de code de l'environnement local, par exemple cp1251. Comment puis-je gérer de telles chaînes?

Était-ce utile?

La solution

Les chaînes ne stockent aucune information de codage. Vous devez simplement en spécifier une lors de la conversion vers / à partir d'unicode ou de l'impression sur un périphérique de sortie:

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

UTF-8 n'est pas unicode, c'est un codage d'unicode en chaînes à un octet.

La meilleure pratique consiste à travailler avec Unicode partout côté Python, à stocker vos chaînes avec un codage réversible Unicode tel que UTF-8 et à les convertir en environnements locaux sophistiqués uniquement pour la sortie utilisateur.

Autres conseils

La détection du codage de jeu de caractères est très complexe.

Cependant, quel est votre véritable objectif? si vous voulez juste valoriser être en unicode, écrivez simplement

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

et cela devrait fonctionner pour tous les cas que vous avez mentionnés ci-dessus:

  • mac os: unicode (unicode) - > unicode
  • gagner / eng: unicode (ascii) - > unicode
  • win / noneng: unicode (some_cp) - > sera converti par cp local - > unicode

Si vous avez une chaîne raisonnablement longue dans un codage inconnu, vous pouvez essayer de deviner le codage, par exemple. avec le détecteur de codage universel à l'adresse https://github.com/dcramer/chardet - ne vous y trompez pas Bien sûr, mais parfois on devine bien ;-). Mais cela ne va pas beaucoup aider avec des chaînes très courtes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top