Python pour afficher les caractères spéciaux
Je sais qu'il y a des tonnes de fils sur cette question, mais je n'ai pas réussi à en trouver un qui résout mon problème.
Je suis en train d'imprimer une chaîne de caractères, mais lors de l'impression qu'il n'affiche pas les caractères spéciaux (par exemple, ĉ, ĝ, å, ö, ü). Lorsque j'imprime la chaîne à l'aide de repr()
c'est ce que j'obtiens:
u'Von D\xc3\xbc'
et u'\xc3\x96berg'
Personne ne sait comment je peux convertir ce pour Von Dü
et Öberg
? Il est important pour moi que ces caractères ne sont pas ignorés, par exemple myStr.encode("ascii", "ignore")
.
MODIFIER
C'est le code que j'utilise. J'utilise BeautifulSoup de gratter un site web. Le contenu d'une cellule (<td>
) dans un tableau (<table>
), est mis dans la variable name
. C'est la variable qui contient des caractères spéciaux que je ne peut pas imprimer.
web = urllib2.urlopen(url);
soup = BeautifulSoup(web)
tables = soup.find_all("table")
scene_tables = [2, 3, 6, 7, 10]
scene_index = 0
# Iterate over the <table>s we want to work with
for scene_table in scene_tables:
i = 0
# Iterate over < td> to find time and name
for td in tables[scene_table].find_all("td"):
if i % 2 == 0: # td contains the time
time = remove_whitespace(td.get_text())
else: # td contains the name
name = remove_whitespace(td.get_text()) # This is the variable containing "nonsense"
print "%s: %s" % (time, name,)
i += 1
scene_index += 1
Je suis en utilisant le terminal par défaut dans Mac OS X et UTF-8 est activé.
OriginalL'auteur simonbs | 2012-04-02
Vous devez vous connecter pour publier un commentaire.
De prévention vaut mieux que guérir. Ce que vous avez besoin est de savoir comment les déchets sont en cours de création. Merci d'éditer votre question afin de montrer le code qui le crée, et alors nous pouvons vous aider à le résoudre. Il ressemble à quelqu'un l'a fait:
Le remède est d'inverser le processus, tout simplement, et puis décoder.
Mise à jour Basé sur le code qui vous a fourni, la cause probable est que le site déclare qu'il est codé dans
ISO-8859-1
(akalatin1
), mais en réalité il est encodé en UTF-8. Veuillez mettre à jour votre question pour nous montrer l'url.Si vous ne pouvez pas l'afficher, lire le BS docs; on dirait que vous aurez besoin d'utiliser:
name
. C'est la variable qui contient des caractères spéciaux que je ne peut pas imprimer.À l'aide de
name.encode('latin1').decode('utf8')
résout tous mes problèmes. Les personnages semble parfait, mais tu dis que ce n'est pas la bonne façon de le faire?Re-lecture de la première phrase de ma réponse. Il est toujours préférable de comprendre votre réel problème et de le résoudre à la source, non pas en aval. Que de codage/décodage est simplement d'inverser le problème sous-jacent.
BeautifulSoup(web, from_encoding='utf8')
a fait le tour. Merci beaucoup!OriginalL'auteur John Machin
Support de l'Unicode dans de nombreuses langues est source de confusion, de sorte que votre erreur ici est compréhensible. Ces chaînes sont octets UTF-8, ce qui pourrait fonctionner correctement si vous déposez le
u
à l'avant:Pour beaucoup plus d'informations:
http://www.joelonsoftware.com/articles/Unicode.html
http://docs.python.org/howto/unicode.html
Vous devriez vraiment lire ces liens et de comprendre ce qui se passe avant de continuer. Si, toutefois, vous avez absolument besoin d'avoir quelque chose qui fonctionne aujourd'hui, vous pouvez utiliser cette horrible hack que je suis gêné de poster publiquement:
repr()
, c'est ce que j'obtiens:Ãberg
mais ce que je voudrais avoir, c'est deÖberg
. Si j'utilisedecode('utf-8')
, je vais obtenir unUnicodeEncodeError
. Si les chaînes sont en UTF-8, il ne devrait pas écrire unÖ
au lieu deÃ
?Vous aurez envie de comprendre comment ces variables a pour être de type
unicode
en premier lieu. En fait ils sont codés en UTF-8 en ascii, donc ils doivent être correctement de typestr
.-1 pour (1) la jointure/map/chr/map/ord mess (2) "UTF-8 codé en ascii"
OriginalL'auteur A B
Le contenu de ces chaînes ne sont pas unicode, ils sont codés en UTF-8.
Edit:
repr()
, c'est ce que j'obtiens:Ãberg
mais ce que je voudrais avoir, c'est deÖberg
. Si les chaînes sont en UTF-8, il ne devrait pas écrire unÖ
au lieu deÃ
? Si j'utiliseunicode
, j'obtiens l'erreur suivante:TypeError: decoding Unicode is not supported
.Vous devez toujours utiliser l'unicode (identificateur de
u'foo'
). Il est codé en UTF-8 chaîne et par l'utilisation de l'unicode identifiant, vous dites que c'est de l'unicode où il ne l'est pas. C'est pourquoi vous obtenezÃ
au lieu deÖ
. Baisse de l'identifiant et vous serez amende. Je vais mettre à jour ma réponse pour le rendre clair.J'ai mis à jour ma réponse. Vous devriez toujours lire ce lien: docs.python.org/howto/unicode.html
Je viens de lire le lien. Je suis encore un peu confus, cependant. J'ai ma chaîne,
myStr
, qui est de typeunicode
, sens de l'unicode identificateur. Je veux supprimer cet identifiant et un codés en UTF-8 chaîne. Comment puis-je faire? J'avais pensé qu'il serait simple commemyStr.encode("utf-8")
qui retourne un objet de typestr
mais cela jette unUnicodeDecodeError
erreur.Cela devrait fonctionner. Pouvez-vous poster cet exemple dans votre question ou à pastebin.com ?
OriginalL'auteur Fabian