fold
バイトではなく文字を認識するように設定できますか?繁体字中国語はそれぞれ3バイト(最小UTF-8)でエンコードされているようです。つまり、fold
sが-w
3の倍数でない場合、次のようなことが発生します。
$ cat in.txt
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩慢,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在川普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人後的應變策略演練,讓人驚訝的是,郭詢問在場幹
$ cat in.txt | fold # -w is 80 by default
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩��
�,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在�
��普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在場幹
fold
デフォルトの出力幅は80列なので、26 * 3 + 2
1行に26 2/3文字(または80バイト)が印刷されます。したがって、-w
文字の破損を防ぐために3の倍数に設定する必要があります。それでは、少なくともfold
、columns=bytes
.についてはもう一度申し上げますが、fold
マルチバイト文字をサポートするように設定できますか?マニュアルページにはこれについて何も言及されていません。
答え1
GNU FoldとGNU fmtは文字ではなくバイトだけを理解します。特定の文字数に改行するには、sedを使用できます。
sed 's/.\{20\}/&\n/g' <in.txt
【財經中心、政治中心╱台北報導】看不慣政
府施政效率緩慢,鴻海集團董事長郭台銘動念
選總統!《壹週刊》報導,在川普勝選當晚,
郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在
場幹
スペースを取り除きたい場合(さまざまな言語に役立つ)、ここにすばやく汚れたawkスクリプトがあります。
awk '
BEGIN {width = 20}
NF == 0 {column = 0; print}
{
split($0, a);
for (i in a) {
w = length(a[i]) + 1;
column += w;
if (column > width) {column = w; print ""};
if (column != w) printf " ";
printf "%s", a[i];
}
}
END {if (column) print ""}'
とにかく、あなたのロケール設定が正しいです。特に、LC_CTYPE
正しい文字エンコーディングを指定する必要があります。たとえば、UnicodeをUTF-8でエンコードしLC_CTYPE=en_US.utf8
たりLC_CTYPE=zh_CN.utf8
(システムで利用可能なすべての言語コードが機能する)
画面幅ではない文字数を計算します。固定幅フォントにも二重幅文字がある可能性があります。これは通常、中国語の文字の場合です。たとえば、上記の文字幅が20のテキストは、一般的な端末で40列を占めます。
答え2
システムにUTF-8文字を処理できるvimがある場合は、次のことを試すことができます。
次のvim exモードコマンドを次の名前のファイルに挿入します。fold.vim
set formatoptions+=m
" uncomment and update the line below to set line width to e.g. 60 chars
" textwidth=60
normal! gqG<Esc>
wq
まあ、あなたの中国語の文字がthenというファイルにある場合は、chinese_chars
プロンプトで実行できます。
vim -e chinese_chars < fold.vim
これは、vim -e
「ex」モードでvimを起動し、STDINからexコマンドを読み取ることを意味します。
vimスクリプトの説明
~から:h fo-table
mは、255文字を超えるマルチバイト文字でも中断されます。これは、各文字がそれ自体の単語であるアジアのテキストに役立ちます。
では、これはどういう意味ですか?
デフォルトでは、このgq
コマンドは10進数255を超える文字では機能しません。たとえば、報
この文字の10進値は22,577です。
実行は、set formatoptions+=m
割り込みがのテキストで使用されることを意味しますchinese_chars
。
引用:
http://vim.1045645.n5.nabble.com/textwidth-doesn-t-work-for-China-td1142655.html
私にとって、これはファイルをその場で編集し、chinese_chars
79または80文字に改行します。これはgq
通常モードコマンドのデフォルトです。