2015-09-07 6 views
6

Wenn ich meine Python-Code ausführen, bekomme ich folgende Fehler:'UCS-2' Codec kann nicht Zeichen in Position kodieren 1050-1050

File "E:\python343\crawler.py", line 31, in <module> 
    print (x1) 
    File "E:\python343\lib\idlelib\PyShell.py", line 1347, in write 
    return self.shell.write(s, self.tags) 
UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 1050-1050: Non-BMP character not supported in Tk 

Hier ist mein Code:

x = g.request('search', {'q' : 'TaylorSwift', 'type' : 'page', 'limit' : 100})['data'][0]['id'] 

# GET ALL STATUS POST ON PARTICULAR PAGE(X=PAGE ID) 
for x1 in g.get_connections(x, 'feed')['data']: 
    print (x1) 
    for x2 in x1: 
     print (x2) 
     if(x2[1]=='status'): 
      x2['message'] 

Wie kann ich das beheben?

+0

, wenn Sie nicht-bmp Unicode-Zeichen sehen müssen; Sie könnten Python interaktiv in der Umgebung ausführen, die sie beispielsweise in der ConEmu-Konsole oder in einem Webbrowser anzeigen kann. Versuchen Sie [ipython notebook] (http://ipython.org/notebook.html). – jfs

Antwort

17

Ihre Daten enthalten Zeichen außerhalb der Basic Multilingual Plane. Emojis zum Beispiel befinden sich außerhalb des BMP und das von IDLE, Tk verwendete Fenstersystem kann mit solchen Zeichen nicht umgehen.

Sie könnten einen translation table verwenden alles, was außerhalb des BMP auf die replacement character zur Karte:

import sys 
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd) 
print(x.translate(non_bmp_map)) 

Die non_bmp_map bildet alle Codepunkte außerhalb der BMP (jeder Codepunkt höher als 0xFFFF, den ganzen Weg bis zum highest Unicode codepoint your Python version can handle) zu U+FFFD REPLACEMENT CHARACTER:

>>> print('This works! \U0001F44D') 
This works! 
>>> print('This works! \U0001F44D'.translate(non_bmp_map)) 
This works! � 
+0

Vielen Dank, aber nach dem Hinzufügen dieser, zeigt einen neuen Fehler: print (x1.translate (non_bmp_map)) AttributeError: 'dict' Objekt hat kein Attribut 'übersetzen', so wie es geht ?? – Andi

+1

@Andi: 'x1' ist keine Zeichenkette, sondern ein Wörterbuch. Sie könnten 'str (x1) .translate (non_bmp_map)' in diesem Fall tun. –

+0

Es funktioniert, vielen Dank. – Andi