折りたたみとテキストフィールド

折りたたみとテキストフィールド

foldバイトではなく文字を認識するように設定できますか?繁体字中国語はそれぞれ3バイト(最小UTF-8)でエンコードされているようです。つまり、foldsが-w3の倍数でない場合、次のようなことが発生します。

$ cat in.txt
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩慢,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在川普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人後的應變策略演練,讓人驚訝的是,郭詢問在場幹

$ cat in.txt | fold # -w is 80 by default
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩��
�,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在�
��普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在場幹

foldデフォルトの出力幅は80列なので、26 * 3 + 21行に26 2/3文字(または80バイト)が印刷されます。したがって、-w文字の破損を防ぐために3の倍数に設定する必要があります。それでは、少なくともfoldcolumns=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列を占めます。

おすすめ記事