Blame platform-demos/el/strings.py.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:e="http://projectmallard.org/experimental/" type="guide" style="task" id="strings.py" xml:lang="el">
Packit 1470ea
Packit 1470ea
<info>
Packit 1470ea
  <title type="text">Συμβολοσειρές (Python)</title>
Packit 1470ea
  <link type="guide" xref="beginner.py#theory"/>
Packit 1470ea
  <link type="next" xref="label.py"/>
Packit 1470ea
  <revision version="0.1" date="2012-06-16" status="draft"/>
Packit 1470ea
Packit 1470ea
  <desc>Μια εξήγηση πώς να αντιμετωπίσετε τις συμβολοσειρές σε Python και GTK+.</desc>
Packit 1470ea
  <credit type="author copyright">
Packit 1470ea
    <name>Sebastian Pölsterl</name>
Packit 1470ea
    <email its:translate="no">sebp@k-d-w.org</email>
Packit 1470ea
    <years>2011</years>
Packit 1470ea
  </credit>
Packit 1470ea
  <credit type="editor">
Packit 1470ea
    <name>Marta Maria Casetti</name>
Packit 1470ea
    <email its:translate="no">mmcasetti@gmail.com</email>
Packit 1470ea
    <years>2012</years>
Packit 1470ea
  </credit>
Packit 1470ea
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Ελληνική μεταφραστική ομάδα GNOME</mal:name>
Packit 1470ea
      <mal:email>team@gnome.gr</mal:email>
Packit 1470ea
      <mal:years>2012-2015</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Δημήτρης Σπίγγος</mal:name>
Packit 1470ea
      <mal:email>dmtrs32@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2012, 2013</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Μαρία Θουκιδίδου</mal:name>
Packit 1470ea
      <mal:email>marablack3@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2014</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Θάνος Τρυφωνίδης</mal:name>
Packit 1470ea
      <mal:email>tomtryf@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2014, 2015</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
<title>Συμβολοσειρές</title>
Packit 1470ea
Packit 1470ea
<links type="section"/>
Packit 1470ea
Packit 1470ea
<note style="warning">

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

</note>
Packit 1470ea
Packit 1470ea
<section id="python-2">
Packit 1470ea
<title>Συμβολοσειρές σε Python 2</title>
Packit 1470ea
Packit 1470ea

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

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

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

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

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

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="python-3">
Packit 1470ea
<title>Συμβολοσειρές σε Python 3</title>
Packit 1470ea
Packit 1470ea

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.

Packit 1470ea
Packit 1470ea

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

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

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

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

Επιπλέον:

Packit 1470ea
Packit 1470ea
Packit 1470ea
>>> txt == unicode_string
Packit 1470ea
Packit 1470ea

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

Packit 1470ea
Packit 1470ea

Αυτό είναι ιδιαίτερα σημαντικό εάν θέλετε να διεθνοποιήσετε το πρόγραμμά σας χρησιμοποιώντας <link href="http://docs.python.org/library/gettext.html">gettext</link>. Πρέπει να βεβαιωθείτε ότι η gettext θα επιστρέψει κωδικοποιημένες συμβολοσειρές 8 δυαδικών UTF-8 για όλες τις γλώσσες.

Packit 1470ea
Packit 1470ea

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

Packit 1470ea
Packit 1470ea

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

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="references">
Packit 1470ea
<title>Αναφορές</title>
Packit 1470ea
Packit 1470ea

<link href="http://python-gtk-3-tutorial.readthedocs.org/en/latest/unicode.html">How To Deal With Strings - The Python GTK+ 3 Tutorial</link>

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
</page>