[PYTHON] Code de personnage † Obscurité † Rapport de rencontre part1

Statut

Sous Windows7 64 bits, Python 2.7.5 Le robot d'exploration qui collecte le Foursquare Venue que j'utilise depuis longtemps est devenu un outil. Puisque je ne l'utilise que moi-même, l'entrée et la sortie sont assez appropriées. L'entrée est la latitude et la longitude du coin supérieur droit et inférieur gauche de la bbox, et la sortie est ID, nom du lieu, latitude et longitude, genre, Séparé par des virgules, en supposant qu'il soit écrit en csv. Puisqu'il était censé être exécuté sur la ligne de commande, la sortie est une sortie standard afin qu'elle puisse être écrite dans un fichier par redirection. Lors de l'attente d'une entrée, une erreur de sortie du texte quant à ce qu'il faut saisir (affichage tel que "latitude à l'extrémité nord-est"). Le code source est écrit en utf-8.

Symptômes de † l'obscurité †

Exécutez comme suit sur la ligne de commande.

command1


$ python foursquare_crawler.py > washington_venues.csv
蛹 擲 遶 縺 邱 蠎 ヲ ・

Caractères déformés ... Le code source de cette partie est le suivant.

source1


sys.stderr.write("Latitude nord-est:")
first_ne_lat = float(sys.stdin.readline())

Je pensais simplement que le code de caractère de l'invite de commande était mauvais, j'ai donc temporairement changé le code de caractère de l'invite de commande de cp932 (Shift-JIS) à utf-8. Sous Windows, utf-8 s'appelle cp65001 ...

command2


$ chcp 65001
Active code page: 65001

Exécutez à nouveau.

command3


$ python foursquare_crawler.py > washington_venues.csv
北東端の緯度:

… (´ ・ ω ・ `) Cette fois, décrivez explicitement la sortie d'erreur comme utf-8 dans le programme.

source2


sys.stderr = codecs.getwriter('utf-8')(sys.stderr)
sys.stdin = codecs.getwriter('utf-8')(sys.stdin)
sys.stderr.write("Latitude nord-est:")
first_ne_lat = float(sys.stdin.readline())

J'ai également écrit que l'entrée standard devrait être reçue par utf-8. Mais pas de changement ...

Solution

Je me demandais ce qui s'était passé, alors je l'ai fait en Unicode.

source3


sys.stderr.write(u"Latitude nord-est:")
first_ne_lat = float(sys.stdin.readline())

De plus, restaurez le code de caractère de l'invite de commande et exécutez-le.

command3


$ chcp 932
Page de code actuelle: 932
$ python foursquare_crawler.py > washington_venues.csv
Latitude nord-est:

C'est fait (゜ ∀ ゜)! !! !! Je ne l'ai pas étudié en détail, mais comme les chaînes de caractères sont généralement gérées pour chaque octet, il semble y avoir divers problèmes avec les caractères pleine largeur tels que les caractères japonais et demi-largeur tels que les alphabets lors de la division d'une chaîne de caractères en plusieurs octets. Cependant, avec Unicode, un caractère est traité par un caractère, il semble donc qu'Unicode est meilleur lorsqu'il s'agit de japonais en Python.

Maintenant, rendons toutes les chaînes Unicode ...

Recommended Posts

Code de personnage † Obscurité † Rapport de rencontre part1
Code de caractère
code de caractère python
Partie 1 Tentative de codage des mathématiques (∈)
Script de vérification de code de caractère de code source
2.x, 3.x code de caractères des séries python
Code de caractère appris en Python