2010-03-19 11 views
5

Tengo una matriz que contiene caracteres japoneses, así como "normal". ¿Cómo alineo la impresión de estos?Python utf-8, cómo alinear la impresión

#!/usr/bin/python 
# coding=utf-8 

a1=['する', 'します', 'trazan', 'した', 'しました'] 
a2=['dipsy', 'laa-laa', 'banarne', 'po', 'tinky winky'] 

for i,j in zip(a1,a2): 
    print i.ljust(12),':',j 

print '-'*8 

for i,j in zip(a1,a2): 
    print i,len(i) 
    print j,len(j) 

Salida:

する  : dipsy 
します : laa-laa 
trazan  : banarne 
した  : po 
しました : tinky winky 
-------- 
する 6 
dipsy 5 
します 9 
laa-laa 7 
trazan 6 
banarne 7 
した 6 
po 2 
しました 12 
tinky winky 11 

gracias, // Fredrik

+0

Creo que a la gente en Japón, usted tiene una mezcla de "normal" y Romanji. Y a las personas en Tailandia ... – MtnViewMark

Respuesta

4

Usando la función unicodedata.east_asian_width, realice un seguimiento de qué caracteres son angostos y anchos al calcular la longitud de la cadena.

#!/usr/bin/python 
# coding=utf-8 

import sys 
import codecs 
import unicodedata 

out = codecs.getwriter('utf-8')(sys.stdout) 

def width(string): 
    return sum(1+(unicodedata.east_asian_width(c) in "WF") 
     for c in string) 

a1=[u'する', u'します', u'trazan', u'した', u'しました'] 
a2=[u'dipsy', u'laa-laa', u'banarne', u'po', u'tinky winky'] 

for i,j in zip(a1,a2): 
    out.write('%s %s: %s\n' % (i, ' '*(12-width(i)), j)) 

Salidas:

する   : dipsy 
します  : laa-laa 
trazan  : banarne 
した   : po 
しました  : tinky winky 

que no se ve a la derecha en algunas fuentes del navegador, pero en una ventana de terminal que se alinean correctamente.

+0

tab no es una solución, lo que realmente estoy haciendo es generar sphinx-tables que contengan conjugaciones de verbos japoneses. Comprobaré la función east_asian_width ... –

+0

perfecta, justo lo que estaba buscando al menos en teoría. Aunque intentar ejecutarlo me da esto: $ ./try.py Traceback (última llamada más reciente): Archivo "./try.py", línea 12, en imprimir i, '' * (12- width (i)), ':', j UnicodeEncodeError: el códec 'latin-1' no puede codificar caracteres en la posición 0-1: ordinal no en el rango (256) –

+0

@Fredrick Ouch, es posible que tenga que mirar ' sys.setdefaultencoding'. http://blog.ianbicking.org/illusive-setdefaultencoding.html –

2

utilizar Unicode objetos en lugar de cadenas de bytes:

#!/usr/bin/python 
# coding=utf-8 

a1=[u'する', u'します', u'trazan', u'した', u'しました'] 
a2=[u'dipsy', u'laa-laa', u'banarne', u'po', u'tinky winky'] 

for i,j in zip(a1,a2): 
    print i.ljust(12),':',j 

print '-'*8 

for i,j in zip(a1,a2): 
    print i,len(i) 
    print j,len(j) 

Unicode objetos trato con caracteres directamente.

+0

Esto no resuelve el problema. –

+0

usando u'string 'Obtengo UnicodeEncodeError:' latin-1 'codec no puede codificar caracteres en la posición 0-1: ordinal no en rango (256) resuelto haciendo una impresión j.encoding (' utf-8 ') pero parece extremadamente incómodo ... –

+0

@ jleedev-Mi consola dice lo contrario. ¿Puedes ser mas específico? ¿Qué resultados estás obteniendo? @ Fredrik: suena como si tu terminal quisiera usar la codificación Latin-1. Tendrás que encontrar la manera de convencerlo de usar UTF-8, o escribir tu salida en un archivo en lugar de imprimir (recomiendo 'importar códecs; f = codecs.open ('output.txt', encoding = 'utf) -8 ') '). ¡Buena suerte! – jcdyer

Cuestiones relacionadas