Ruby:東アジアの幅をチェック(Unicode)
-
10-10-2019 - |
質問
Rubyを使用して、列形式の文字列を端子に出力する必要があります。このようなもの:
| row 1 | a string here | etc
| row 2 | another string | etc
文字列#ljustと%sを使用して、ラテンUTF8文字でこれをうまく行うことができます。
しかし、キャラクターが韓国語、中国語などの場合に問題が発生します。韓国語などを含む列が散らばっている英語の列がある場合、列は単に整列しません。
ここで列アライメントを取得するにはどうすればよいですか?固定幅フォントに相当するアジア文字を出力する方法はありますか? VIMで表示および編集することを意図したドキュメントについてはどうですか?
解決
パーティーに遅れましたが、うまくいけばまだ役立つ:Rubyでは、 unicode-display_width gem 文字列の東アジア幅を確認するには:
require 'unicode/display_width'
"⚀".display_width #=> 1
'一'.display_width #=> 2
他のヒント
あなたの問題はCJK(中国/日本/韓国語)で起こります 全幅と幅の広いキャラクター (図も下にスクロールします);これらの文字は、2つの固定幅細胞を占めています。 String#ljust
そして、友人はこれを考慮しません。
がある unicodedata.east_asian_width
Pythonでは、独自の幅を認識しているLjustを書くことができますが、Rubyには存在しないようです。私が見つけることができた最高のものは、このブログ投稿です: http://d.hatena.ne.jp/hush_puppy/20090227/1235740342 (機械翻訳)。オリジナルの下部にある出力を見ると、それはあなたが望むことをしているようですので、Rubyコードの一部を再利用できるかもしれません。
または、完全な幅の文字のみを印刷する場合(つまり、半幅と全幅をミックスしていない場合)、怠け者になり、間隔やボックス描画など、すべてのフル幅の形式を使用することができます。コピーして貼り付けることができるいくつかのキャラクターです。
- |(全幅の垂直バー)
- (全幅のスペース)
- -(全幅のダッシュ;端末フォントでうまくレンダリングされません)
- ー(別の幅のダッシュ)