Chaîne d'octets python encoder et décoder
Je suis en train de convertir la réception d'une chaîne d'octets qui contient des caractères non-ascii dans un valide chaîne utf-8 que j'ai dump est comme json.
b = '\x80'
u8 = b.encode('utf-8')
j = json.dumps(u8)
Je m'attendais j à '\xc2\x80 mais j'obtiens:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)
Dans ma situation, 'b' est à venir à partir de mysql via google protocol buffers et est rempli avec des données blob.
Des idées?
EDIT:
J'ai des trames ethernet qui sont stockés dans une table mysql comme un blob (s'il vous plaît, tout le monde, restez sur le sujet et éviter de discuter de pourquoi il y a des paquets dans un tableau). Le tableau de classement est utf-8 et l'db (couche de sqlalchemy, non-orm) est saisissant les données et la création de structures (google protocol buffers) qui stockent le blob comme un python 'str'. Dans certains cas, j'utilise le protocole de tampons directement avec toute la question. Dans d'autres cas, j'ai besoin d'exposer les mêmes données via json. Ce que j'ai remarqué c'est que lorsque json.décharges() fait sa chose, '\x80' peut être remplacé par la disposition invalide char unicode (\ufffd iirc)
source d'informationauteur kung-foo
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour examiner la documentation de l'API logicielle que vous utilisez. De BLOB est un acronyme: BINAIRE Objet de Grande taille.
Si vos données sont en fait binaires, l'idée de les décoder en Unicode est évidemment un non-sens.
Si elle est en fait le texte, vous devez savoir ce que le codage à utiliser pour décoder Unicode.
Puis vous utilisez
json.dumps(a_Python_object)
... si vous encoder en UTF-8 vous-même,json
va décoder une fois de plus:Mise à JOUR sur
latin1
:u'\x80'
est inutile de sens C1 caractère de contrôle -- l'encodage est extrêmement rare d'être Latin-1. Latin-1 est "un piège et une illusion" -- tous les octets de 8 bits sont décodés en Unicode sans lever d'exception. Ne pas confondre "travaux" et "ne pas soulever une exception".Utilisation
b.decode('name of source encoding')
pour obtenir une version unicode. C'était surprenant pour moi quand je l'ai appris. par exemple:Je pense que ce que vous essayez de faire est de décoder la chaîne de l'objet de certains de codage. Savez-vous ce que l'encodage est? Pour obtenir de l'unicode objet.
et puis de le ré-encodage unicode objet à l'aide de la utf_8 encodage en une chaîne de caractères de l'objet.
À l'aide de l'unicode objet en tant que traducteur, sans savoir ce que le codage d'origine de la chaîne est je ne peut pas le savoir pour certains, mais il est possible que la conversion ne pourra pas aller comme prévu. L'unicode objet n'est pas destiné pour convertir des chaînes d'un encodage à l'autre. Je souhaite travailler avec l'unicode objet en supposant que vous savez ce que le codage est, si vous ne savez pas ce que le codage est alors il n'y a vraiment pas un moyen de trouver sans essai et d'erreur, puis de les convertir en revenir à la chaîne codée lorsque vous souhaitez qu'un objet de type string à l'arrière.