# Συμβολοσειρές (Python)

Μια εξήγηση πώς να αντιμετωπίσετε τις συμβολοσειρές σε Python και GTK+.
Sebastian Pölsterl
sebp@k-d-w.org 2011
Marta Maria Casetti
mmcasetti@gmail.com 2012
Ελληνική μεταφραστική ομάδα GNOME
team@gnome.gr 2012-2015
Δημήτρης Σπίγγος
dmtrs32@gmail.com 2012, 2013
Μαρία Θουκιδίδου
marablack3@gmail.com 2014
Θάνος Τρυφωνίδης
tomtryf@gmail.com 2014, 2015

# Συμβολοσειρές

Το GNOME ενθαρρύνει έντονα τη χρήση του python 3 για συγγραφή εφαρμογών!

# Συμβολοσειρές σε Python 2

Ο Python 2 έρχεται με δύο διαφορετικά είδη αντικειμένων που μπορούν να χρησιμοποιηθούν για αναπαράσταση συμβολοσειρών, `str` και `unicode`. Περιπτώσεις του `unicode` χρησιμοποιούνται για να εκφράσουν συμβολοσειρές Unicode, ενώ περιπτώσεις του τύπου `str` είναι αναπαραστάσεις byte (η κωδικοποιημένη συμβολοσειρά). Στα αφανή, ο Python αντιπροσωπεύει συμβολοσειρές Unicode ως είτε 16- ή 32- δυαδικών ακέραιους, ανάλογα με το πώς ο διερμηνευτής Python μεταγλωττίστηκε.

>>> unicode_string = u"Fu\u00dfb\u00e4lle" >>> print unicode_string Fußbälle

Οι συμβολοσειρές Unicode μπορούν να μετατραπούν σε συμβολοσειρές 8 δυαδικών με `unicode.encode()`. Οι συμβολοσειρές 8 δυαδικών έχουν μια μέθοδο `str.decode()` που ερμηνεύει τη συμβολοσειρά χρησιμοποιώντας τη δεδομένη κωδικοποίηση (δηλαδή, είναι το αντίστροφο της `unicode.encode()`):

>>> type(unicode_string) <type 'unicode'> >>> unicode_string.encode("utf-8") 'Fu\xc3\x9fb\xc3\xa4lle' >>> utf8_string = unicode_string.encode("utf-8") >>> type(utf8_string) <type 'str'> >>> unicode_string == utf8_string.decode("utf-8") True

Δυστυχώς, ο Python 2.x επιτρέπει την ανάμειξη `unicode` και `str` εάν η συμβολοσειρά 8 δυαδικών συμβεί να περιέχει μόνο bytes μόνο 7 δυαδικών (ASCII), αλλά θα μπορούσε να πάρει UnicodeDecodeError εάν περιέχει μη ASCII τιμές.

# Συμβολοσειρές σε Python 3

Since Python 3.0, all strings are stored as Unicode in an instance of the `str` type. Encoded strings on the other hand are represented as binary data in the form of instances of the bytes type. Conceptually, `str` refers to text, whereas bytes refers to data. Use `encode()` to go from `str` to `bytes`, and `decode()` to go from `bytes` to `str`.

Επιπλέον, δεν είναι πια δυνατό να αναμείξετε συμβολοσειρές Unicode με κωδικοποιημένες συμβολοσειρές, επειδή θα καταλήξει σε ένα `TypeError`:

>>> text = "Fu\u00dfb\u00e4lle" >>> data = b" sind rund" >>> text + data Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can't convert 'bytes' object to str implicitly >>> text + data.decode("utf-8") 'Fußbälle sind rund' >>> text.encode("utf-8") + data b'Fu\xc3\x9fb\xc3\xa4lle sind rund'

# Unicode σε GTK+

Το GTK+ χρησιμοποιεί κωδικοποιημένες συμβολοσειρές UTF-8 για όλα τα κείμενα. Αυτό σημαίνει ότι εάν καλέσετε μια μέθοδο που επιστρέφει μια συμβολοσειρά θα παίρνετε πάντα ένα στιγμιότυπο του τύπου `str`. Το ίδιο εφαρμόζεται στις μεθόδους που περιμένουν μια ή περισσότερες συμβολοσειρές ως παράμετρο, πρέπει να είναι κωδικοποιημένες UTF-8. Όμως, για ευκολία το PyGObject θα μετατρέπει αυτόματα οποιοδήποτε στιγμιότυπο unicode σε str εάν του δοθεί ως όρισμα:

>>> from gi.repository import Gtk >>> label = Gtk.Label() >>> unicode_string = u"Fu\u00dfb\u00e4lle" >>> label.set_text(unicode_string) >>> txt = label.get_text() >>> type(txt) <type 'str'>

Επιπλέον:

>>> txt == unicode_string

Θα επέστρεφε `False`, με την προειδοποίηση `__main__:1: UnicodeWarning: η σύγκριση όμοιων Unicode απέτυχε να μετατρέψει και τα δυο ορίσματα σε Unicode - ερμηνεύοντας τα ως ανόμοια` (`Gtk.Label.get_text()` θα επιστρέφει πάντα ένα στιγμιότυπο `str`· συνεπώς, `txt` and `unicode_string` δεν είναι όμοια).

Αυτό είναι ιδιαίτερα σημαντικό εάν θέλετε να διεθνοποιήσετε το πρόγραμμά σας χρησιμοποιώντας `gettext`. Πρέπει να βεβαιωθείτε ότι η `gettext` θα επιστρέψει κωδικοποιημένες συμβολοσειρές 8 δυαδικών UTF-8 για όλες τις γλώσσες.

Γενικά συνιστάται να μην χρησιμοποιείτε αντικείμενα `unicode` σε εφαρμογές GTK+ καθόλου και να χρησιμοποιείτε κωδικοποιημένα αντικείμενα `str` UTF-8 αφού το GTK+ δεν ενσωματώνει πλήρως αντικείμενα `unicode`.

Με την Python 3.x τα πράγματα είναι πολύ πιο ομοιόμορφα, επειδή το PyGObject θα κωδικοποιήσει/αποκωδικοποιήσει αυτόματα προς/από UTF-8 εάν περάσετε μια συμβολοσειρά σε μια μέθοδο ή εάν μια μέθοδος επιστρέφει μια συμβολοσειρά. Συμβολοσειρές, ή κείμενο, θα αναπαριστώνται πάντα ως στιγμιότυπα `str`.

# Αναφορές

How To Deal With Strings - The Python GTK+ 3 Tutorial