March 2, 2012

Σχετικά με το UTF-8

Με αφορμή μια προσπάθεια επεξήγησης ενός γνωστού για το utf-8 (χωρίς να αναφερθώ καθόλου σε hexadecimal notation ...)


Λοιπόν
Όλοι όσοι προγραμματίζουμε και χρησιμοποιούμε utf-8 πρέπει να πάμε πρώτα στην σελίδα
http://www.joelonsoftware.com/articles/Unicode.html

Τι ακριβώς είναι το utf-8 ;
διερωτηθείτε!


To utf-8 είναι υπερσύνολο του ascii .
τo ascii χωράει 2 στην 8γδόη δηλαδή 256 διαφορετικούς χαρακτήρες αλλά αποτελείται από 128
το utf-8 χωράει 1,112,064 code points και επειδή είναι variable-width encoding (χρησιμοποιεί από 1 έως και 4 bytes για την αναπαράσταση χαρακτήρων και όχι αυστηρά μόνο 4 bytes ή 1 κλπ) ουσιαστικά έχει 17 code points των 2 στην 16 (65,536) θέσεων χαρακτήρων δηλαδή 17 × 65,536 = 1,114,112 .
θεωρητικά θα μπορούσε να έχει 2 στην 32 αλλά ο μέγιστος αριθμός χαρακτήρων unicode είναι 2097152 ( 2 στην 21) για τα utf-16 ή 32...
http://en.wikipedia.org/wiki/UTF-8
http://unicode.org/faq/utf_bom.html#gen0
στο utf-8 μπορείς να βρείς τους 128 πρώτους ascii χαρακτήρες στις ίδιες δυαδικές θέσεις με ίδιες δυαδικές τιμές
δηλαδή έxουν ακριβώς τα ίδια bytes , έπειτα το utf-8 έχει τους δικούς του χαρακτήρες...

παράδειγμα σε python

>>> a= u'a'
>>> ord(a)
97
>>> a= 'a'
>>> ord(a)
97
>>> z = u'a'
>>> ord(z)
97
>>> z = 'a'
>>> ord(z)
97
>>> a= u'a'
>>> ord(a)
97
>>> a= 'a'
>>> ord(a)
97
>>> z = u'z'
>>> ord(z)
122
>>> z = 'z'
>>> ord(z)
122
>>> xx= u'δ'
>>> ord(xx)
948
>>> xx= 'δ'
>>> ord(xx)

Traceback (most recent call last):
File "", line 1, in
TypeError: ord() expected a character, but string of length 2 found
>>> unicode(xx)

Traceback (most recent call last):
File "", line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
>>> unicode(xx,'utf-8')
u'\u03b4'
>>> ord(unicode(xx,'utf-8'))
948
>>>

No comments:

Post a Comment

Γράψτε εδώ τα σχόλια σας!!!

ΤΙ ΘΑ ΓΙΝΕΙ ΤΟ 2012?