2009-05-28 8 views
3

Ich versuche, PyObjC unter Mac OS X herauszufinden, und ich habe ein einfaches Programm geschrieben, um die Namen in meinem Adressbuch auszudrucken. Ich habe jedoch Probleme mit der Codierung der Ausgabe.Unicode-Probleme in PyObjC

#! /usr/bin/env python 
# -*- coding: UTF-8 -*- 

from AddressBook import * 

ab = ABAddressBook.sharedAddressBook() 
people = ab.people() 

for person in people: 
    name = person.valueForProperty_("First") + ' ' + person.valueForProperty_("Last") 
    name 

, wenn ich dieses Programm ausführen, sieht die Ausgabe etwa so:

...snip... 
u'Jacob \xc5berg' 
u'Fernando Gonzales' 
...snip... 

Könnte jemand bitte erklären, warum die Zeichenfolgen in Unicode sind, aber der Inhalt sieht aus wie das?

Ich habe auch bemerkt, dass, wenn ich versuche, den Namen I kodiert

UnicodeEncodeError: 'ascii' codec can't encode character u'\xc5' in position 6: ordinal not in range(128) 

Antwort

1

Wenn Sie den Code in Ihrer Frage in der interaktiven Konsole ausgeführt wird der Dolmetscher wegen der letzten Anweisung der Schleife der repr von „namen“ drucken.

Wenn Sie die letzte Zeile der Schleife von nur "Name" zu "Druckname" ändern, sollte die Ausgabe in Ordnung sein. Ich habe dies mit Terminal.app auf einem 10.5.7-System getestet.

+0

Funktioniert nicht für mich. –

0

nur das Schreiben der Variablennamen in die Standardausgabe sendet repr(name) und repr() alle Unicode-Werte zu erhalten, den Fehler zu drucken.

print versucht, u'Jacob \xc5berg' in ASCII zu konvertieren, die nicht funktioniert. Versuchen Sie es in eine Datei zu schreiben.

Siehe Print Fails on the python wiki.

Das bedeutet, Sie verwenden Legacy, begrenzte oder falsch konfigurierte Konsole. Wenn Sie gerade versuchen, mit Unicode bei interaktiver Eingabeaufforderung zu spielen, gehen Sie zu einer modernen Unicode-bewußten Konsole. Die meisten modernen Python-Distributionen kommen mit IDLE, wo Sie alle Unicode-Zeichen drucken können.

2
# -*- coding: UTF-8 -*- 

wirkt sich nur auf die Art und Weise Python Kommentare und Stringliterale in Ihrer Quelle dekodiert, nicht die Art und Weise der Standardausgabe konfiguriert ist, etc, etc. Wenn Sie Ihren Mac Terminal auf UTF-8 (Terminal gesetzt, Preferences, Settings, Advanced, International dropdown) und nach dem Encodieren in UTF-8 (print name.encode("utf-8")) Unicode-Text ausgeben, sollte alles in Ordnung sein.

0

zu einem Unicode-String durch Konvertieren es:

print unicode(name) 
+0

Es ist bereits eine Unicode-Saite, wie sie von den'Fernando Gonzales 'gesehen werden kann. –

+0

Vielleicht, ja, aber das * behebt * das Problem. Ich bin mir auch nicht sicher warum, ich bin nicht tief genug in Pythons String-Handhabung. –