可以fold
设置为识别字符而不是字节吗?繁体中文字符似乎每个都以三个字节编码(至少在 UTF-8 中),这意味着如果fold
s-w
不是三的倍数,则会发生以下情况:
$ cat in.txt
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩慢,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在川普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人後的應變策略演練,讓人驚訝的是,郭詢問在場幹
$ cat in.txt | fold # -w is 80 by default
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩��
�,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在�
��普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在場幹
fold
的默认输出宽度为 80 列,这会导致26 * 3 + 2
每行打印 26 2/3 个字符( 或 80 个字节)。因此,-w
必须设置为三的倍数以避免字符损坏。所以,至少对于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
必须指定正确的字符编码,例如,LC_CTYPE=en_US.utf8
或者LC_CTYPE=zh_CN.utf8
(系统上可用的任何语言代码都可以)将 Unicode 编码为 UTF-8。
请注意,这计算的是字符,而不是屏幕宽度。即使是固定宽度的字体也可以有双宽字符,这通常是针对中文字符,因此,例如,上述文本的字符宽度为 20 在典型终端上占用 40 列。
答案2
如果您的系统上有 vim(可以处理 UTF-8 字符),您可以尝试以下操作:
将这些 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
那么如果你的中文字符在一个名为chinese_chars
then 的文件中,你可以从提示符下运行它。
vim -e chinese_chars < fold.vim
其中vim -e
表示以“ex”模式启动 vim 并从 STDIN 读取 ex 命令
vim脚本解释
从:h fo-table
m 也会在 255 以上的多字节字符处中断。这对于每个字符独立为一个单词的亚洲文本很有用。
那么这意味着什么呢?
默认情况下,该gq
命令不适用于十进制数大于 255 的字符。例如,此 char:報
的十进制值为 22,577。
运行set formatoptions+=m
意味着中断将与 中的文本一起使用chinese_chars
。
参考:
http://vim.1045645.n5.nabble.com/textwidth-doesn-t-work-for-Chinese-td1142655.html
对我来说,这会就地编辑文件chinese_chars
并在 79 或 80 个字符处换行 - 这是gq
正常模式命令的默认值。