2011-01-13 13 views
6

Usando Ruby, tengo que enviar cadenas en forma de columna al terminal. Algo como esto:Ruby: Comprobando el ancho del este de Asia (Unicode)

| row 1  | a string here  | etc 
| row 2  | another string | etc 

Puedo hacerlo bien con caracteres Latin UTF8 utilizando String # ljust y% s.

Pero surge un problema cuando los personajes son coreano, chino, etc. Las columnas simplemente no se alinean cuando hay filas de Inglés intercaladas con las filas que contienen coreano, etc.

¿Cómo puedo conseguir la alineación de la columna aquí ? ¿Hay alguna forma de mostrar caracteres asiáticos en el equivalente de una fuente de ancho fijo? ¿Qué tal si se trata de documentos que se muestran y editan en Vim?

+2

Usando vim, tiene la configuración '' guifontwide'' que le permite elegir una fuente de ancho doble para texto asiático. – Benoit

+1

Su elección de palabras es muy pobre. Asia es un lugar muy grande con muchos países, idiomas y sistemas de escritura. – koan

+0

@dan Es el problema con solo idiomas coreanos/chinos/... {asiáticos} o con cualquier carácter cuyo 'len()' sea mayor que 1 (por ejemplo, '« '). Si lo es, entonces para obtener la longitud real del texto, use 'len (split (str, '\ zs'))' en lugar de 'len (str)' (vim-7.2, 'strwidth (str)' en vim- 7.3). – ZyX

Respuesta

1

tarde a la fiesta, pero es de esperar todavía útiles: En Ruby, se puede utilizar el unicode-display_width gem para comprobar si este-asiático-ancho de una cadena:

require 'unicode/display_width' 
"⚀".display_width #=> 1 
'一'.display_width #=> 2 
3

Su problema ocurre con CJK (chino/japonés/coreano) full-width and wide characters (también desplácese hacia abajo para ver los diagramas); esos personajes ocupan dos celdas de ancho fijo. String#ljust y amigos no toman esto en cuenta.

Hay unicodedata.east_asian_width en Python, lo que le permitiría escribir su propio ljust de ancho, pero no parece existir en Ruby. Lo mejor que he podido encontrar es esta publicación de blog: http://d.hatena.ne.jp/hush_puppy/20090227/1235740342 (machine translation). Si miras la salida en la parte inferior del original, parece que haces lo que quieres, así que tal vez puedas reutilizar parte del código de Ruby.

O si solo está imprimiendo caracteres de ancho completo (es decir, no está mezclando medio ancho y ancho completo), puede ser flojo y simplemente usar formas de ancho completo de todo, incluido el espaciado y el dibujo de caja. Aquí está un par de caracteres que se pueden copiar y pegar:

  • | (barra vertical a todo lo ancho)
  • (espacio de ancho completo)
  • - (guión de ancho completo; no quede rendido muy bien en mi la fuente terminal)
  • ー (otro guión de ancho completo)
+0

Probé cómo se comporta la función 'strwidth' con estos caracteres y encontré que' strwidth ("|") 'devuelve 2, no 1. Sin embargo, no sé cómo verificar el ancho en ruby. – ZyX

+0

Al leer su comentario anterior, supongo que se está refiriendo a la función 'strwidth' de Vim 7.3? Entonces, aparentemente, no tiene en cuenta los caracteres de ancho completo (nunca intenté reclamar eso, en caso de que obtuviera la impresión ^^). La barra vertical que publiqué definitivamente es de ancho completo, en cualquier caso. –

+0

@Jo Liss De hecho, dije que tiene en cuenta caracteres de ancho completo (con la barra normal o el borde de la mesa utf-8 devolverá 1). – ZyX

Cuestiones relacionadas