<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:e="http://projectmallard.org/experimental/" type="guide" style="task" id="strings.py" xml:lang="el">

<info>
  <title type="text">Συμβολοσειρές (Python)</title>
  <link type="guide" xref="tutorial.py#theory"/>
  <revision version="0.1" date="2012-06-16" status="draft"/>

  <desc>Μια εξήγηση πώς να αντιμετωπίσετε τις συμβολοσειρές σε Python και GTK+.</desc>
  <credit type="author copyright">
    <name>Sebastian Pölsterl</name>
    <email>sebp@k-d-w.org</email>
    <years>2011</years>
  </credit>
  <credit type="editor">
    <name>Marta Maria Casetti</name>
    <email>mmcasetti@gmail.com</email>
    <years>2012</years>
  </credit>
</info>

<title>Συμβολοσειρές</title>

<links type="section"/>

<section id="definitions">
<title>Ορισμοί</title>

<p>Εννοιολογικά μια <em>συμβολοσειρά</em> είναι μια λίστα <em>χαρακτήρων</em> όπως 'A', 'B', 'C' or 'È'. Οι χαρακτήρες είναι αφηρημένες αναπαραστάσεις και το νόημα τους εξαρτάται από τη γλώσσα και το περιεχόμενο στο οποίο χρησιμοποιούνται. Το <em>τυπικό Unicode</em> περιγράφει πώς οι χαρακτήρες αναπαριστώνται από <em>σημεία κώδικα</em>. Για παράδειγμα οι παραπάνω χαρακτήρες αναπαριστώνται με τα σημεία κώδικα U+0041, U+0042, U+0043 και U+00C9, αντίστοιχα. Βασικά, τα σημεία κώδικα είναι αριθμοί στην περιοχή από 0 έως 0x10FFFF.</p>

<p>Η αναπαράσταση μιας συμβολοσειράς ως μιας λίστας σημείων κώδικα είναι αφηρημένη. Για να μετατρέψετε αυτήν την αφηρημένη αναπαράσταση σε μια σειρά bytes η συμβολοσειρά Unicode πρέπει να <em>κωδικοποιηθεί</em>. Η απλούστερη μορφή κωδικοποίησης είναι η ASCII και εκτελείται ως εξής:</p>

<list>
  <item><p>Εάν το σημείο κώδικα είναι αυστηρά μικρότερο από 128, κάθε byte είναι η ίδια όπως η τιμή του σημείου κώδικα.</p></item>
  <item><p>Εάν το σημείο κώδικα είναι 128 ή μεγαλύτερο, η συμβολοσειρά Unicode δεν μπορεί να αναπαρασταθεί σε αυτήν την κωδικοποίηση. (Ο Python εγείρει μια εξαίρεση <sys>UnicodeEncodeError</sys> σε αυτήν την περίπτωση.)</p></item>
</list>

<p>Αν και η κωδικοποίηση ASCII είναι απλή στην εφαρμογή μπορεί να κωδικοποιήσει μόνο 128 διαφορετικούς χαρακτήρες που είναι ανεπαρκείς. Μια από τις συνηθέστερες χρησιμοποιούμενες κωδικοποιήσεις που αντιμετωπίζει αυτό το πρόβλημα είναι η UTF-8 (μπορεί να χειριστεί οποιοδήποτε σημείο κώδικα Unicode). UTF σημαίνει “μορφή μετασχηματισμού κοινού κώδικα”, και το ‘8’ σημαίνει ότι αριθμοί 8 δυαδικών χρησιμοποιούνται στην κωδικοποίηση.</p>

</section>

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

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

<code><![CDATA[
>>> unicode_string = u"Fu\u00dfb\u00e4lle"
>>> print unicode_string]]>
Fußbälle
</code>

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

<code><![CDATA[
>>> 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]]></code>

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

</section>

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

<p>Από τον Python 3.0, όλες οι συμβολοσειρές αποθηκεύονται ως Unicode σε ένα στιγμιότυπο του τύπου <code>str</code>. Κωδικοποιημένες συμβολοσειρές από την άλλη μεριά αναπαριστώνται ως δυαδικά δεδομένα στη φόρμα στιγμιοτύπων του τύπου bytes. Εννοιολογικά, ο <code>str</code> αναφέρεται σε κείμενο, ενώ τα bytes αναφέρονται σε δεδομένα. Χρησιμοποιήστε <code>encode()</code> για μετάβαση από <code>str</code> σε <code>bytes</code> και <code>decode()</code> για μετάβαση από <code>bytes</code> σε <code>str</code>.</p>

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

<code><![CDATA[
>>> 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']]></code>

</section>

<section id="gtk">
<title>Unicode σε GTK+</title>

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

<code><![CDATA[
>>> 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'>]]></code>

<p>Επιπλέον:</p>

<code><![CDATA[
>>> txt == unicode_string]]></code>

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

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

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

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

</section>

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

<p><link href="http://python-gtk-3-tutorial.readthedocs.org/en/latest/unicode.html">Πώς να αντιμετωπίσετε τις συμβολοσειρές - Το μάθημα Python GTK+ 3</link></p>

</section>

</page>
