当我使用Perl或C来处理printf某些数据时,我尝试使用它们的格式来控制每列的宽度,比如
printf("%-30s", str);
Run Code Online (Sandbox Code Playgroud)
但是当str包含中文字符时,该列不会按预期对齐.看附件图片.
我的ubuntu的charset编码是zh_CN.utf8,据我所知,utf-8编码有1~4个字节长度.汉字有3个字节.在我的测试中,我发现printf的格式控件将中文字符计为3,但它实际上显示为2 ascii宽度.
因此,实际显示宽度不是预期的常数,而是与汉字数量相关的变量,即
Sw(x) = 1 * (w - 3x) + 2 * x = w - x
Run Code Online (Sandbox Code Playgroud)
w是预期的宽度限制,x是中文字符的数量,Sw(x)是实际显示宽度.
因此,中文字符str包含的越多,它显示的越短.
我怎样才能得到我想要的东西?在printf之前计算汉字?
据我所知,我猜所有的中文甚至所有宽字都显示为2宽,那么为什么printf算为3呢?UTF-8的编码与显示长度无关.
我有一个这样的文件,'¬' 代表换行符。
aaaaaa¬
bb¬
cccccccc¬
ddddd¬
Run Code Online (Sandbox Code Playgroud)
我知道我可以在可视块模式下在左侧插入一列并将其更改为此,
eaaaaaa¬
ebb¬
ecccccccc¬
eddddd¬
Run Code Online (Sandbox Code Playgroud)
但是,是否有任何简单的方法可以在任何指定列的右侧插入一列以使其看起来像这样?谢谢。
aaaaaa e¬
bb e¬
cccccccc e¬
ddddd e¬
Run Code Online (Sandbox Code Playgroud)