2011-01-13 20 views
6

Mit Ruby muss ich Strings in einem Spaltenformat an das Terminal ausgeben. So etwas wie das:Ruby: Prüfung auf ostasiatische Breite (Unicode)

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

Ich kann dies gut mit lateinischen UTF8 Zeichen mit String # ljust und% s.

Aber ein Problem entsteht, wenn die Charaktere sind Koreanisch, Chinesisch, usw. Die Spalten einfach nicht ausrichten, wenn es Zeilen der englischen Sprache durchsetzt mit Zeilen mit koreanischen usw.

Wie kann ich Spaltenausrichtung erhalten hier ? Gibt es eine Möglichkeit, asiatische Zeichen im Format einer Schriftart mit fester Breite auszugeben? Wie wäre es mit Dokumenten, die in Vim angezeigt und bearbeitet werden sollen?

+2

Mit vim haben Sie die Einstellung '' guiontwide' ', mit der Sie eine Schriftart mit doppelter Breite für asiatischen Text auswählen können. – Benoit

+1

Ihre Wortwahl ist sehr schlecht. Asien ist ein sehr großer Ort mit vielen Ländern, Sprachen und Schreibsystemen. – koan

+0

@dan Es ist das Problem mit nur koreanischen/chinesischen/... {asiatischen} Sprachen oder mit irgendeinem Zeichen, dessen 'len()' größer als 1 ist (zum Beispiel '' '). Wenn dies der Fall ist, verwenden Sie 'len (split (str, '\ zs'))' anstelle von 'len (str)' (vim-7.2, 'strwidth (str)' auf vim-), um die tatsächliche Länge des Textes zu erhalten. 7.3). – ZyX

Antwort

1

spät zur Party, aber hoffentlich noch hilfreich: In Ruby können Sie die unicode-display_width gem verwenden für eine Zeichenfolge von ostasiatischer-Breite zu überprüfen:

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

Ihr Problem passiert mit CJK (Chinesisch/Japanisch/Koreanisch) full-width and wide characters (auch für Diagramme nach unten scrollen); Diese Zeichen belegen zwei Zellen mit fester Breite. String#ljust und Freunde berücksichtigen dies nicht.

In Python gibt es unicodedata.east_asian_width, mit dem Sie Ihr eigenes bread-aware ljust schreiben könnten, aber es scheint nicht in Ruby zu existieren. Das Beste, was ich finden konnte, ist dieser Blogbeitrag: http://d.hatena.ne.jp/hush_puppy/20090227/1235740342 (machine translation). Wenn Sie sich die Ausgabe am unteren Rand des Originals ansehen, scheint es zu tun, was Sie wollen, vielleicht können Sie also etwas Ruby-Code wiederverwenden.

Oder wenn Sie nur Zeichen mit voller Breite drucken (dh, Sie mischen nicht die halbe Breite und volle Breite), können Sie faul sein und verwenden Sie einfach die gesamte Breite Formen von allem, einschließlich der Abstand und der Kastenzeichnung. Hier ein paar Zeichen, die Sie kopieren und einfügen:

  • | (volle Breite vertikale Leiste)
  • (voller Breite Raum)
  • - (voller Breite Strich, wird nicht gemacht schön in meinem Terminal-Schriftart)
  • ー (ein weiterer voller Breite Strich)
+0

Ich habe getestet, wie sich Ihre 'strwidth'-Funktion mit diesen Zeichen verhält und festgestellt, dass' strwidth ("|") '2 zurückgibt, nicht 1. Ich weiß jedoch nicht, wie die Breite in Ruby überprüft werden soll. – ZyX

+0

Wenn Sie Ihren früheren Kommentar lesen, beziehen Sie sich auf die 'strwidth'-Funktion von Vim 7.3? Dann nimmt es anscheinend keine Zeichen in voller Breite in Anspruch (ich habe nie versucht, das zu behaupten, falls du den Eindruck hast ^^). Die vertikale Leiste, die ich postete, ist auf jeden Fall auf jeden Fall voller Breite. –

+0

@Jo Liss Ich sagte tatsächlich, dass es volle Breite Zeichen berücksichtigt (mit normalen bar oder utf-8 Tabellengrenze wird 1 zurückgeben). – ZyX