J'ai un serveur de socket qui est censé recevoir des caractères valides UTF-8 des clients.
Le problème est que certains clients (principalement des pirates informatiques) envoient tous les mauvais types de données dessus.
Je peux facilement distinguer le client authentique, mais je me connecte aux fichiers de toutes les données envoyées afin de pouvoir les analyser plus tard.
Parfois, je reçois des caractères comme celui-ci œ
qui provoquent l' UnicodeDecodeError
erreur.
J'ai besoin de pouvoir faire la chaîne UTF-8 avec ou sans ces caractères.
Mettre à jour:
Pour mon cas particulier, le service de socket était un MTA et je m'attends donc à recevoir des commandes ASCII telles que:
EHLO example.com
MAIL FROM: <john.doe@example.com>
...
J'enregistrais tout cela dans JSON.
Ensuite, des gens sans bonnes intentions ont décidé de vendre toutes sortes de déchets.
C'est pourquoi pour mon cas spécifique, il est parfaitement correct de supprimer les caractères non ASCII.
la source
Réponses:
http://docs.python.org/howto/unicode.html#the-unicode-type
ou
Remarque: Cela supprimera (ignorera) les caractères en question en renvoyant la chaîne sans eux.
Pour moi, c'est le cas idéal car je l'utilise comme protection contre les entrées non ASCII qui ne sont pas autorisées par mon application.
Alternativement: Utilisez la méthode ouverte du
codecs
module pour lire le fichier:la source
str.decode('cp1252').encode('utf-8')
'\xc0msterdam'
qui se transforme enu'\ufffdmsterdam'
remplacementopen(file_name, "rb")
puis appliquer l'approche de Ben à partir des commentaires ciChanger le moteur de C en Python a fait l'affaire pour moi.
Le moteur est C:
Le moteur est Python:
Aucune erreur pour moi.
la source
csv
fichier. Cela pourrait vous conduire à uneOutOfMemory
erreur ou à un redémarrage automatique du noyau de votre ordinateur portable. Vous devez définir leencoding
sur ce cas.Ce type de problème apparaît pour moi maintenant que je suis passé à Python 3. Je ne savais pas que Python 2 roulait simplement à la vapeur tout problème avec l'encodage de fichiers.
J'ai trouvé cette belle explication des différences et comment trouver une solution après qu'aucune des solutions ci-dessus n'ait fonctionné pour moi.
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
En bref, pour que Python 3 se comporte de manière aussi similaire que possible à Python 2, utilisez:
Cependant, lisez l'article, il n'y a pas de solution unique.
la source
la source
used by default in the legacy components of Microsoft Windows in English and some other Western languages
J'ai eu le même problème avec
UnicodeDecodeError
et je l'ai résolu avec cette ligne. Je ne sais pas si c'est la meilleure façon mais cela a fonctionné pour moi.la source
le premier, Utilisation de get_encoding_type pour obtenir le type de codage des fichiers:
la seconde, en ouvrant les fichiers avec le type:
la source
Juste au cas où quelqu'un aurait le même problème. J'utilise vim avec YouCompleteMe , je n'ai pas pu démarrer ycmd avec ce message d'erreur, ce que j'ai fait est:
export LC_CTYPE="en_US.UTF-8"
le problème a disparu.la source
export LC_CTYPE="en_US.UTF-8"
?Que pouvez-vous faire si vous devez modifier un fichier, mais que vous ne connaissez pas l'encodage du fichier? Si vous savez que l'encodage est compatible ASCII et que vous souhaitez uniquement examiner ou modifier les parties ASCII, vous pouvez ouvrir le fichier avec le gestionnaire d'erreurs de substitution:
la source
J'ai résolu ce problème simplement en ajoutant
la source