Doctest ed encoding utf8

Appunti sui test per Plone e la codifica dei caratteri

Qualche giorno fa mi è capitato di dover testare alcune funzionalità di un prodotto per Plone legate alla codifica dei caratteri; insomma il solito e rognoso problema delle lettere accentate e unicode.

Per chiarirmi la quesitione ho creato un piccolo prodotto d'esempio chiamato Products.testutf8.

Il prodotto contiene solamente i seguenti file:

  1. __init__.py - un file vuoto
  2. configure.zcml - non contiene configurazioni rilevanti per questo esempio)
  3. tests.py - contiene le configurazioni per la suite di test
  4. test_utf8.txt - il file con i doctest

La parte importante risiede nel file tests.py dove dobbiamo definire l'encoding utilizzato per i test.

def test_suite():
return unittest.TestSuite([

# Unit tests
doctestunit.DocFileSuite(
'README.txt', package = 'Products.testutf8',
encoding = 'utf8',
setUp = testing.setUp, tearDown = testing.tearDown)

e questi sono gli utilissimi test che ho effettuato

Istanzio una variabile in unicode contente una stringa piena di accenti 
>>> pippo = u'àèìòù'

>>> type(pippo)
<type 'unicode'>

>>> pippo
u'\xe0\xe8\xec\xf2\xf9'

posso stampare pippo senza problemi e il valore è correttamente 'codificato'
>>> print pippo
àèìòù

Lo stesso posso fare con una stringa 'normale'
>>> pippo = 'àèìòù'
>>> type(pippo)
<type 'str'>

>>> pippo
'\xc3\xa0\xc3\xa8\xc3\xac\xc3\xb2\xc3\xb9'

Prima di stamparla però devo decodificarla in unicode
>>> u_pippo = pippo.decode('utf-8')
>>> type(u_pippo)
<type 'unicode'>

>>> u_pippo
u'\xe0\xe8\xec\xf2\xf9'

adesso la stampo correttamente
>>> print u_pippo
àèìòù
blog comments powered by Disqus