2011-01-13 22 views
6

Sử dụng Ruby, tôi phải xuất chuỗi ở định dạng cột cho thiết bị đầu cuối. Một cái gì đó như thế này:Ruby: Kiểm tra chiều rộng Đông Á (Unicode)

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

Tôi có thể làm điều này tốt với các ký tự UTF8 Latin sử dụng String # ljust và% s.

Tuy nhiên, một vấn đề nảy sinh khi các nhân vật là Hàn Quốc, Trung Quốc, vv Các cột chỉ đơn giản là sẽ không sắp xếp khi có hàng tiếng Anh xen kẽ với hàng chứa Hàn Quốc vv

Làm thế nào tôi có thể nhận được sự liên kết cột ở đây ? Có cách nào để xuất các ký tự Châu Á tương đương với phông chữ có chiều rộng cố định không? Làm thế nào về các tài liệu có nghĩa là để được hiển thị và chỉnh sửa trong Vim?

+2

Sử dụng vim, bạn có cài đặt ''guifontwide'' cho phép bạn chọn phông chữ hai chiều cho văn bản Châu Á. – Benoit

+1

Lựa chọn từ ngữ của bạn rất kém. Châu Á là một nơi rất lớn với nhiều quốc gia, ngôn ngữ và hệ thống văn bản. – koan

+0

@dan Đó là vấn đề với ngôn ngữ Hàn Quốc/Trung Quốc/... {Châu á} hoặc với bất kỳ ký tự nào có 'len()' lớn hơn 1 (ví dụ, '« '). Nếu nó là, sau đó để có được chiều dài thực của văn bản, sử dụng 'len (split (str, '\ zs'))' thay vì 'len (str)' (vim-7.2, 'strwidth (str)' trên vim- 7.3). – ZyX

Trả lời

1

muộn để đảng, nhưng hy vọng vẫn còn hữu ích: Trong Ruby, bạn có thể sử dụng unicode-display_width gem để kiểm tra đông Á-width của một chuỗi:

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

Sự cố của bạn xảy ra với CJK (tiếng Trung/tiếng Nhật/tiếng Hàn) full-width and wide characters (cũng cuộn xuống cho sơ đồ); những ký tự đó chiếm hai ô có chiều rộng cố định. String#ljust và bạn bè không tính đến điều này.

unicodedata.east_asian_width bằng Python, điều này sẽ cho phép bạn viết ljust theo chiều rộng của riêng mình, nhưng nó dường như không tồn tại trong Ruby. Điều tốt nhất tôi có thể tìm thấy là bài đăng trên blog này: http://d.hatena.ne.jp/hush_puppy/20090227/1235740342 (machine translation). Nếu bạn nhìn vào đầu ra ở dưới cùng của bản gốc, nó dường như làm những gì bạn muốn, vì vậy có thể bạn có thể tái sử dụng một số mã Ruby. Hoặc nếu bạn chỉ in các ký tự có độ rộng tối đa (nghĩa là bạn không trộn nửa chiều rộng và toàn chiều rộng), bạn có thể lười biếng và chỉ sử dụng các hình thức có chiều rộng đầy đủ của mọi thứ, bao gồm khoảng trắng và khoảng trắng. hộp vẽ. Dưới đây là một vài ký tự mà bạn có thể sao chép và dán:

  • | (full-width dọc thanh)
  • (full-width gian)
  • - (full-width dash; không được trả lại độc đáo trong tôi phông chữ terminal)
  • ー (một full-width dash)
+0

Tôi đã thử nghiệm hàm 'strwidth' của bạn hoạt động như thế nào với các ký tự này và thấy rằng' strwidth ("|") 'trả về 2, không phải 1. Tôi không biết, tuy nhiên, làm thế nào để kiểm tra chiều rộng trong ruby. – ZyX

+0

Đọc nhận xét trước đó của bạn, tôi đoán bạn đang đề cập đến chức năng 'strwidth' của Vim 7.3? Sau đó, rõ ràng là nó không lấy các ký tự có độ rộng đầy đủ (tôi chưa bao giờ cố gắng tuyên bố rằng, trong trường hợp bạn có ấn tượng ^^). Thanh dọc tôi đã đăng chắc chắn là toàn bộ chiều rộng, trong mọi trường hợp. –

+0

@Jo Liss Tôi thực sự nói rằng nó có các ký tự toàn chiều rộng vào tài khoản (với thanh bình thường hoặc thanh bảng utf-8 nó sẽ trả về 1). – ZyX

Các vấn đề liên quan