2011-01-13 11 views
6

Używając Ruby, muszę wysyłać ciągi w formacie kolumnowym do terminala. Coś takiego:Ruby: Sprawdzanie szerokości wschodnioazjatyckiej (Unicode)

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

mogę zrobić to dobrze ze znaków UTF8 Łacińskiej korzystających String # Ljust% s.

Ale problem pojawia się, gdy bohaterowie są koreański, chiński, itd. W kolumnach po prostu nie będzie wyrównać gdy istnieją wiersze angielskim przeplatane z wierszy zawierających koreański, itp

Jak mogę uzyskać wyrównanie kolumny tutaj ? Czy istnieje sposób na wyprowadzanie znaków azjatyckich w odpowiedniku czcionki o stałej szerokości? Co powiesz na dokumenty, które mają być wyświetlane i edytowane w Vim?

+2

Używając vima, masz ustawienie ''guifontwide'', które pozwala ci wybrać czcionkę o podwójnej szerokości dla tekstu azjatyckiego. – Benoit

+1

Twój wybór słów jest bardzo słaby. Azja to bardzo duże miejsce z wieloma krajami, językami i systemami pisania. – koan

+0

@dan Problem dotyczy tylko języków koreańskich/chińskich/... {asian} lub dowolnego znaku, którego 'len()' jest większe niż 1 (na przykład '« '). Jeśli tak, to aby uzyskać rzeczywistą długość tekstu, użyj 'len (split (str, '\ zs'))' zamiast 'len (str)' (vim-7.2, 'strwidth (str)' na vim- 7.3). – ZyX

Odpowiedz

1

późno do partii, ale mam nadzieję, że nadal pomocne: W Ruby, można użyć unicode-display_width gem aby sprawdzić wschodnioazjatyckich szerokości sznurku za:

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

Twój problem występuje z CJK (chiński/japoński/koreański) full-width and wide characters (również przewiń w dół, aby zobaczyć diagramy); te postacie zajmują dwie komórki o stałej szerokości. String#ljust i przyjaciele nie biorą tego pod uwagę.

W języku Python znajduje się unicodedata.east_asian_width, dzięki czemu można napisać własną lirę o szerokości, ale wydaje się, że nie istnieje ona w Ruby. Najlepsze, co udało mi się znaleźć, to blog: http://d.hatena.ne.jp/hush_puppy/20090227/1235740342 (machine translation). Jeśli spojrzysz na dane wyjściowe na dole oryginału, wydaje się, że robisz to, co chcesz, więc może będziesz mógł użyć kodu Ruby.

Jeśli drukujesz tylko znaki o pełnej szerokości (tzn. Nie mieszasz połowy szerokości i pełnej szerokości), możesz być leniwy i po prostu użyć pełno-szerokościowych form wszystkiego, łącznie z odstępami i rysunek skrzynki. Oto kilka znaków można kopiować i wklejać:

  • | (pełny Szerokość w pionie)
  • (pełna szerokość przestrzeni)
  • - (pełnej szerokości deski rozdzielczej; nie zostanie wygenerowana ładnie w moim czcionka terminal)
  • ー (inny pełnej szerokości myślnik)
+0

Testowałem, jak funkcja 'strwidth' zachowuje się z tymi znakami i stwierdziła, że' strwidth ("|") 'zwraca 2, a nie 1. Nie wiem jednak, jak sprawdzić szerokość w ruby. – ZyX

+0

Czytając swój wcześniejszy komentarz, myślę, że odnosisz się do funkcji 'strwidth' Vima 7.3? Wtedy najwyraźniej nie bierze ona pod uwagę postaci o pełnej szerokości (nigdy nie próbowałem tego twierdzić, na wypadek gdybyś miał wrażenie ^^). Pionowy pasek, który zamieściłem, jest w każdym razie na pewno pełną szerokością. –

+0

@Jo Liss Powiedziałem, że bierze pod uwagę znaki o pełnej szerokości (przy normalnym pasku lub utf-8 table border zwróci 1). – ZyX

Powiązane problemy