
Σκόνταψα πάνω από αυτό το απόσπασμα στο [φροντιστήριο Django](http://www.djangoproject.com/documentation/tutorial01/) :



> 
> Μοντέλα Django έχουν μια προκαθορισμένη **str** () μέθοδος που απαιτεί **Unicode** () και μετατρέπει το αποτέλεσμα σε UTF-8 bytestring. Αυτό σημαίνει ότι unicode (ρ) θα επιστρέψει μια συμβολοσειρά Unicode, και str (ρ) θα επιστρέψει μια κανονική συμβολοσειρά, με χαρακτήρες κωδικοποιούνται ως UTF-8.
> 
> 
> 


Τώρα, είμαι μπερδεμένος γιατί afaik Unicode δεν είναι κάποια συγκεκριμένη παράσταση, έτσι ώστε ό, τι είναι μια «Unicode string» σε Python; Μήπως αυτό σημαίνει ότι UCS-2; Googling εμφανίστηκε [αυτό το «Python Unicode Tutorial»](http://www.reportlab.com/i18n/python_unicode_tutorial.html) , που δηλώνει με τόλμη



> 
> Unicode είναι ένα δύο-byte κωδικοποίηση η οποία καλύπτει το σύνολο των κοινών συστημάτων γραφής του κόσμου.
> 
> 
> 


το οποίο είναι απλό λάθος, ή μήπως είναι; Έχω μπερδευτεί πολλές φορές από το σύνολο χαρακτήρων και θέματα κωδικοποίησης, αλλά εδώ είμαι απολύτως βέβαιος ότι η τεκμηρίωση Διαβάζω είναι συγκεχυμένη. Ξέρει κανείς τι συμβαίνει στην Python, όταν μου δίνει μια «Unicode συμβολοσειρά»;

 
Unicode vs UTF-8 σύγχυση σε Python / Django;
============================================




> 
> αυτό είναι ένα «Unicode string» σε Python; Μήπως αυτό σημαίνει ότι UCS-2;
> 
> 
> 


Οι συμβολοσειρές Unicode σε Python αποθηκεύεται εσωτερικά είτε ως UCS-2 (σταθερού μήκους 16-bit αναπαράσταση, σχεδόν το ίδιο όπως UTF-16) ή UCS-4 / UTF-32 (σταθερού μήκους αναπαράσταση 32-bit). Είναι μια επιλογή μεταγλώττισης? για τα Windows είναι πάντα UTF-16, ενώ πολλές διανομές Linux που UTF-32 (ευρείας οθόνης) για τις εκδόσεις τους Python.


Μπορείτε γενικά δεν πρέπει να φροντίσουν: θα δείτε Unicode κωδικό σημεία ως ενιαία στοιχεία σε χορδές σας και δεν θα ξέρετε αν είναι αποθηκευμένα σε δύο ή τέσσερα bytes. Αν είστε σε μια UTF-16 κατασκευής και θα πρέπει να χειριστεί τους χαρακτήρες εκτός του βασικού πολύγλωσσο αεροπλάνο θα σας κάνουν λάθος, αλλά αυτό είναι ακόμα πολύ σπάνια, και οι χρήστες που χρειάζονται πραγματικά τα επιπλέον χαρακτήρες θα πρέπει να κατάρτιση ευρύ χτίζει.



> 
> απλό λάθος, ή μήπως είναι;
> 
> 
> 


Ναι, αυτό είναι εντελώς λάθος. Για να είμαστε δίκαιοι νομίζω ότι το σεμινάριο είναι αρκετά παλιά? κατά πάσα πιθανότητα προ-ημερομηνίες μεγάλη χορδές Unicode, αν όχι Unicode 3.1 (η έκδοση που εισήγαγε χαρακτήρες εκτός του βασικού πολύγλωσσο αεροπλάνο).


Υπάρχει μια πρόσθετη πηγή σύγχυσης που απορρέουν από τη συνήθεια των Windows για τη χρήση του όρου «Unicode» να σημαίνει, συγκεκριμένα, η κωδικοποίηση UTF-16LE που NT χρησιμοποιεί εσωτερικά. Άνθρωποι από Microsoftland μπορεί συχνά να αντιγράψετε αυτό το κάπως παραπλανητική συνήθεια.

 

καταστήματα Python Unicode όπως UTF-16. str () θα επιστρέψει το UTF-8 αναπαράσταση του UTF-16 χορδών.

 

Από [τη Βικιπαίδεια σε UTF-8](http://en.wikipedia.org/wiki/UTF-8) :



> 
> UTF-8 (8-bit UCS / Unicode Format Μετασχηματισμού) είναι ένα **μεταβλητού μήκους κωδικοποίηση χαρακτήρων για Unicode. Είναι σε θέση να εκπροσωπεί οποιονδήποτε χαρακτήρα στο πρότυπο Unicode** , αλλά η αρχική κωδικοποίηση των κωδίκων byte και αναθέσεις χαρακτήρα UTF-8 είναι συμβατό με ASCII. Για τους λόγους αυτούς, είναι σταθερά όλο τον προτιμώμενο κωδικοποίηση για το e-mail, web σελίδες [1], και άλλα μέρη όπου οι χαρακτήρες αποθηκεύονται ή σε συνεχή ροή.
> 


Έτσι, είναι οπουδήποτε μεταξύ ενός και τεσσάρων bytes, ανάλογα με το ποια χαρακτήρα που θέλετε να αντιπροσωπεύουν μέσα στη σφαίρα της Unicode.


[Από τη Βικιπαίδεια σε Unicode:](http://en.wikipedia.org/wiki/Unicode)



> 
> Στην πληροφορική, Unicode είναι ένα βιομηχανικό πρότυπο που επιτρέπει στους υπολογιστές να αντιπροσωπεύουν με συνέπεια και να χειριστείτε το κείμενο που εκφράζονται στα **περισσότερα από τα συστήματα γραφής στον κόσμο** . 
> 


Έτσι είναι σε θέση να εκπροσωπεί περισσότερες (αλλά όχι όλες) των συστημάτων γραφής του κόσμου. 


Ελπίζω αυτό να βοηθήσει :)

 


> 
> έτσι τι είναι μια «Unicode string» σε Python;
> 
> 
> 


Python «γνωρίζει» ότι η χορδή σας είναι Unicode. Ως εκ τούτου, αν το κάνετε regex σε αυτό, θα γνωρίζουν ποια είναι ο χαρακτήρας και η οποία δεν είναι κλπ, τα οποία είναι πραγματικά χρήσιμη. Αν κάνατε μια strlen θα δώσει επίσης το σωστό αποτέλεσμα. Για παράδειγμα, αν δεν κορδόνι υπολογίζετε σε Γεια σας, θα πάρετε 5 (ακόμα κι αν είναι Unicode). Αλλά αν κάνατε μια καταμέτρηση σειρά από μια ξένη λέξη και η σειρά δεν ήταν μια σειρά Unicode από ό, τι θα έχουν πολύ μεγαλύτερο αποτέλεσμα. Pythong χρησιμοποιεί τα στοιχεία που αποτελούν τη βάση δεδομένων χαρακτήρων Unicode για την αναγνώριση κάθε χαρακτήρα στη συμβολοσειρά Unicode. Ελπίδα που βοηθά.

 

Εν τω μεταξύ, έκανα μια εκλεπτυσμένη έρευνα για να εξακριβώσει ποια είναι η εσωτερική αναπαράσταση σε Python είναι, και επίσης ποια είναι τα όριά της. « [Η αλήθεια για Unicode Στην Python](http://www.cmlenz.net/archives/2008/07/the-truth-about-unicode-in-python "Η αλήθεια για Unicode στην Python") » είναι ένα πολύ καλό άρθρο που παραθέτει απ 'ευθείας από τους προγραμματιστές Python. Προφανώς, εσωτερική αναπαράσταση είναι είτε UCS-2 ή UCS-4 ανάλογα με ένα διακόπτη μεταγλώττισης χρόνου. Έτσι, ο Jon, δεν είναι UTF-16, αλλά η απάντησή σας με βάλει στο σωστό δρόμο ούτως ή άλλως, ευχαριστώ.

 